سؤال

كان هذا السؤال تم طرحه بالفعل في سياق C#/.Net.

الآن أود أن أتعلم الاختلافات بين البنية والفئة في C++.يرجى مناقشة الاختلافات التقنية بالإضافة إلى أسباب اختيار أحدهما أو الآخر في تصميم OO.

سأبدأ بفارق واضح:

  • إذا لم تحدد public: أو private:, ، يكون أعضاء البنية عامًا بشكل افتراضي؛يكون أعضاء الفصل خاصين بشكل افتراضي.

أنا متأكد من وجود اختلافات أخرى في الزوايا الغامضة لمواصفات C++.

هل كانت مفيدة؟

المحلول

لقد نسيت الفرق الثاني الصعب بين الفئات والبنيات.

Quoth المعيار (§11.2.2 في C++ 98 إلى C++ 11):

في غياب أ محدد الوصول بالنسبة للفئة الأساسية ، يفترض أن الجمهور عندما يتم الإعلان عن الفئة المشتقة البنية ويفترض الخاص عند الإعلان عن الفصل فصل.

ومن أجل الاكتمال فقط، تم تعريف الفرق الأكثر شهرة بين الفئة والبنية في (11.2):

عضو في فئة محددة مع الكلمة الرئيسية فصل نكون خاص بشكل افتراضي.أعضاء فئة محددة مع الكلمات الرئيسية البنية أو اتحادنكون عام بشكل افتراضي.

فرق إضافي:الكلمة الرئيسية class يمكن استخدامها للإعلان عن معلمات القالب، في حين أن struct لا يمكن استخدام الكلمة الأساسية على هذا النحو.

نصائح أخرى

نقلا عن الأسئلة الشائعة حول لغة C++,

[7.8] ما الفرق بين الكلمات الرئيسية هيكل وفئة؟

الأعضاء والفئات الأساسية ل تكون البنية عامة بشكل افتراضي ، بينما في فئة ، هم الافتراضي إلى خاص.ملحوظة:يجب أن تجعل الفصول الأساسية الخاصة بك بشكل صريح عام أو خاص أو المحمية ، بدلا من الاعتماد على افتراضيات.

الهيكل والطبقة خلاف ذلك مكافئ وظيفيا.

حسنا ، يكفي من هذا التنظيف الحاد تكنو توك.عاطفيا ، معظم المطورين جعل التمييز القوي بين الطبقة والبنية.A هيكل ببساطة يبدو وكأنه كومة مفتوحة من البتات مع القليل جدا في طريق التغليف أو الوظيفة.A الطبقة تبدو وكأنها لقمة العيش و عضو مسؤول في المجتمع مع خدمات ذكية، قوية حاجز التغليف ، وبئر واجهة محددة.لأن هذا هو دلالة معظم الناس لديهم بالفعل ، ربما يجب عليك استخدام البنية الكلمة الرئيسية إذا كان لديك فصل يحتوي على طرق قليلة جدا ولديها بيانات عامة (مثل هذه الأشياء موجودة في تصميم جيد الأنظمة!) ، ولكن بخلاف ذلك يجب عليك ربما استخدم الكلمة الأساسية للفئة.

من المفيد أن نتذكر أصول لغة C++ والتوافق معها.

تحتوي لغة C على بنيات، وليس لديها مفهوم التغليف، لذلك كل شيء عام.

يعتبر كونك عامًا بشكل افتراضي فكرة سيئة بشكل عام عند اتباع نهج موجه للكائنات، لذلك عند إنشاء نموذج من لغة C يفضي أصلاً إلى OOP (يمكنك القيام بـ OO في لغة C، لكنه لن يساعدك) والذي كان هو الحل الفكرة في C++ (في الأصل "C With Classes")، فمن المنطقي جعل الأعضاء خاصين بشكل افتراضي.

ومن ناحية أخرى، إذا كان ستروستروب قد غير دلالات struct بحيث يكون أعضاؤها خاصين بشكل افتراضي، فهذا قد يؤدي إلى انتهاك التوافق (لم يعد هذا صحيحًا في كثير من الأحيان مع تباين المعايير، ولكن جميع برامج C الصالحة كانت أيضًا برامج C++ صالحة، مما كان له تأثير كبير على إعطاء C++ موطئ قدم).

لذلك كلمة رئيسية جديدة، class تم تقديمه ليكون تمامًا مثل البنية، ولكنه خاص بشكل افتراضي.

إذا كانت لغة C++ قد أتت من الصفر، بدون أي سجل، فمن المحتمل أن تحتوي على كلمة رئيسية واحدة فقط.ومن المحتمل أيضًا أنه لم يكن ليحدث التأثير الذي أحدثه.

بشكل عام، يميل الأشخاص إلى استخدام البنية عندما يقومون بشيء مثل كيفية استخدام البنيات في لغة C؛أعضاء عموميون، لا يوجد مُنشئ (طالما أنه ليس في اتحاد، فأنت يستطيع لديك مُنشئات في البنيات، تمامًا كما هو الحال مع الفصول الدراسية، لكن الأشخاص لا يميلون إلى ذلك)، ولا توجد طرق افتراضية، وما إلى ذلك.نظرًا لأن اللغات تهدف إلى التواصل مع الأشخاص الذين يقرأون التعليمات البرمجية بقدر ما تهدف إلى توجيه الآلات (وإلا فإننا سنلتزم بالتجميع وأكواد تشغيل VM الأولية) فمن الجيد الالتزام بذلك.

أعضاء الفصل خاصون بشكل افتراضي.أعضاء Struct يكونون علنيين بشكل افتراضي.بالإضافة إلى أنه لا توجد اختلافات أخرى.انظر أيضا هذا السؤال.

وفقا لستروستروب في لغة البرمجة C++:

يعتمد الأسلوب الذي تستخدمه على الظروف والذوق.أنا عادة أفضّل الاستخدام struct للفئات التي تحتوي على كافة البيانات عامة.أعتقد أن هذه الفئات هي "أنواع ليست مناسبة تمامًا، بل مجرد هياكل بيانات."

وظيفيا، لا يوجد فرق آخر غير العام / الخاص

STRUCT هو نوع من نوع البيانات المجردة الذي يقسم جزءًا معينًا من الذاكرة وفقًا لمواصفات البنية.تعتبر الهياكل مفيدة بشكل خاص في تسلسل/إلغاء تسلسل الملفات حيث يمكن كتابة البنية في كثير من الأحيان إلى الملف حرفيًا.(أي.احصل على مؤشر إلى البنية، واستخدم الماكرو SIZE لحساب عدد البايتات المراد نسخها، ثم انقل البيانات داخل البنية أو خارجها.)

الفئات هي نوع مختلف من أنواع البيانات المجردة التي تحاول ضمان إخفاء المعلومات.داخليًا، يمكن أن يكون هناك مجموعة متنوعة من المكائد والأساليب والمتغيرات المؤقتة ومتغيرات الحالة.إلخ.يتم استخدامها جميعًا لتقديم واجهة برمجة تطبيقات متسقة لأي كود يرغب في استخدام الفصل.

في الواقع، الهياكل تدور حول البيانات، والفئات تدور حول التعليمات البرمجية.

ومع ذلك، عليك أن تفهم أن هذه مجرد أفكار مجردة.من الممكن تمامًا إنشاء بنيات تشبه إلى حد كبير الفئات والفئات التي تشبه إلى حد كبير الهياكل.في الواقع، كانت المترجمات الأقدم لـ C++ مجرد مترجمات مسبقة تترجم كود C++ إلى C.وبالتالي فإن هذه التجريدات هي فائدة للتفكير المنطقي، وليست بالضرورة مصدر قوة للكمبيوتر نفسه.

بالإضافة إلى حقيقة أن كل منها عبارة عن نوع مختلف من التجريد، توفر الفصول حلولاً للغز تسمية كود C.نظرًا لأنه لا يمكنك عرض أكثر من وظيفة واحدة بنفس الاسم، فقد اعتاد المطورون على اتباع نمط _().على سبيل المثالmathlibextreme_max().من خلال تجميع واجهات برمجة التطبيقات (APIs) في فئات، يمكن تجميع الوظائف المماثلة (هنا نسميها "الطرق") معًا وحمايتها من تسمية الأساليب في فئات أخرى.يتيح ذلك للمبرمج تنظيم الكود الخاص به بشكل أفضل وزيادة إعادة استخدام الكود.من الناحية النظرية على الأقل.

1) يكون أعضاء الفصل خاصين بشكل افتراضي وأعضاء البنية عامون بشكل افتراضي.

على سبيل المثال فشل البرنامج 1 في الترجمة والبرنامج 2 يعمل بشكل جيد.

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

2) عند اشتقاق بنية من فئة/بنية، يكون محدد الوصول الافتراضي للفئة/البنية الأساسية عامًا.وعند اشتقاق فئة، يكون محدد الوصول الافتراضي خاصًا.

على سبيل المثال فشل البرنامج 3 في الترجمة والبرنامج 4 يعمل بشكل جيد.

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}

والفرق الآخر الوحيد هو الميراث الافتراضي للفئات والبنيات، والذي ليس من المستغرب أن يكون خاصًا وعامًا على التوالي.

ليس في المواصفات، لا.يكمن الاختلاف الرئيسي في توقعات المبرمج عندما يقرأون الكود الخاص بك خلال عامين.غالبًا ما يُفترض أن الهياكل هي POD.تُستخدم الهياكل أيضًا في البرمجة الوصفية للقالب عندما تقوم بتعريف نوع لأغراض أخرى غير تعريف الكائنات.

هناك شيء آخر يجب ملاحظته، إذا قمت بتحديث تطبيق قديم يحتوي على بنيات لاستخدام الفئات، فقد تواجه المشكلة التالية:

يحتوي الكود القديم على بنيات، وتم تنظيف الكود وتغييره إلى فئات.تمت بعد ذلك إضافة وظيفة افتراضية أو اثنتين إلى الفئة المحدثة الجديدة.

عندما تكون الوظائف الافتراضية موجودة في الفئات، سيقوم المترجم داخليًا بإضافة مؤشر إضافي إلى بيانات الفئة للإشارة إلى الوظائف.

كيف يمكن أن يؤدي ذلك إلى كسر الكود القديم إذا تم مسح البنية في الكود القديم في مكان ما باستخدام memfill لمسحها بالكامل إلى الأصفار، وهذا من شأنه أن يدوس بيانات المؤشر الإضافية أيضًا.

  1. أعضاء البنية عامة بشكل افتراضي، وأعضاء الفئة خاصة بشكل افتراضي.
  2. الوراثة الافتراضية للبنية من بنية أو فئة أخرى هي عامة. الوراثة الافتراضية للفئة من بنية أو فئة أخرى هي خاصة.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

هذا على VS2005.

الفرق الرئيسي الآخر هو عندما يتعلق الأمر بالقوالب.بقدر ما أعرف، يمكنك استخدام فئة عند تحديد قالب ولكن ليس البنية.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
  1. عضو في فئة محددة بالكلمة الأساسية class نكون private بشكل افتراضي.أعضاء فئة محددة مع الكلمات الرئيسية struct (أو union) نكون public بشكل افتراضي.

  2. في حالة عدم وجود محدد وصول للفئة الأساسية، public يفترض عندما مشتق تم الإعلان عن الطبقة struct و private يفترض عند الإعلان عن الفصل class.

  3. يمكنك أن تعلن enum class ولكن ليس enum struct.

  4. يمكنك استخدام template<class T> لكن لا template<struct T>.

لاحظ أيضًا أن معيار C++ يسمح لك بإعادة توجيه نوع ما باعتباره a struct, ، ثم استخدم class عند التصريح بالنوع والعكس.أيضًا، std::is_class<Y>::value يكون true لكون Y a struct و أ class, ، لكن هو false ل enum class.

وهنا تفسير جيد: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

لذا، مرة أخرى:في لغة C++، تكون البنية مماثلة للفئة باستثناء أن أعضاء البنية لديهم رؤية عامة بشكل افتراضي، ولكن أعضاء الفئة لديهم رؤية خاصة بشكل افتراضي.

إنها مجرد اتفاقية.يمكن إنشاء الهياكل للاحتفاظ ببيانات بسيطة ولكنها تتطور لاحقًا مع إضافة وظائف الأعضاء والمنشئات.ومن ناحية أخرى، من غير المعتاد رؤية أي شيء آخر غير الجمهور:الوصول في الهيكل.

آيزو إيك 14882-2003

9 فصول

§3

البنية هي فئة معرفة ب ال مفتاح الفصل struct;أعضاؤها والفئات الأساسية (البند 10) هي عام بشكل افتراضي (البند 11).

لقد ذكرت الإجابات الأخرى الإعدادات الافتراضية الخاصة/العامة، (ولكن لاحظ أن البنية عبارة عن فئة وهي بنية؛فهما ليسا عنصرين مختلفين، بل هما طريقتان لتعريف نفس العنصر).

ما قد يكون مثيرًا للاهتمام أن نلاحظه (خاصة وأن السائل من المحتمل أن يستخدم MSVC++ لأنه يذكر لغة C++ "غير مُدارة") هو أن Visual C++ يشتكي في ظل ظروف معينة إذا تم الإعلان عن فئة باستخدام class ومن ثم تعريف مع struct (أو ربما العكس)، على الرغم من أن المعيار ينص على أن هذا قانوني تمامًا.

  • .في الفصول الدراسية ، يكون جميع الأعضاء بشكل افتراضي خاصين ولكن في الهيكل الأعضاء عامون بشكل افتراضي.

    1. لا يوجد مصطلح مثل المُنشئ والمدمر للبنيات، ولكن بالنسبة لمترجم الفئة، يتم إنشاء الإعداد الافتراضي إذا لم تقم بتوفيره.

    2. حجم البنية الفارغة هو 0 بايت بينما حجم الفئة الفارغة هو 1 بايت. نوع الوصول الافتراضي للبنية هو عام.يجب أن يكون الهيكل عادة ما تستخدم لتجميع البيانات.

    نوع الوصول الافتراضي للفئة هو خاص، والوضع الافتراضي ل الميراث خاص.يجب استخدام فئة لتجميع البيانات و الطرق التي تعمل على تلك البيانات.

    باختصار ، الاتفاقية هي استخدام البنية عندما يكون الغرض هو تجميع البيانات ، واستخدام الفئات عندما نحتاج إلى تجريد البيانات و ، ربما الميراث.

    في C ++ يتم تمرير الهياكل والفئات حسب القيمة ، ما لم يكن ذلك صراحة غير مرجع.في لغات أخرى قد يكون الطبقات والهياكل دلالات متميزة - أي.يمكن تمرير الكائنات (مثيلات الفئات) حسب المرجع والهياكل قد يتم تمريرها حسب القيمة.ملحوظة:هناك التعليقات المرتبطة بهذا السؤال.انظر صفحة المناقشة إلى أضف إلى المحادثة.

على الرغم من أن الإجابات الأخرى تشير ضمنيًا إلى ذلك، إلا أنه لم يتم ذكر ذلك صراحةً - أن البنيات متوافقة مع لغة C، اعتمادًا على الاستخدام؛الطبقات ليست كذلك.

هذا يعني أنه إذا كنت تكتب رأسًا وتريد أن يكون متوافقًا مع لغة C، فلن يكون لديك خيار آخر غير البنية (والتي في عالم لغة C لا يمكن أن تحتوي على وظائف؛ولكن يمكن أن تحتوي على مؤشرات وظيفية).

الفرق بين class و struct هو الفرق بين الكلمات الرئيسية، وليس بين أنواع البيانات.هذا اثنين

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

كلاهما يحدد نوع الفصل.الفرق بين الكلمات الرئيسية في هذا السياق هو الوصول الافتراضي المختلف:

  • foo::x عام و foo_base ورثت علنا
  • bar::x خاصة و bar_base موروثة بشكل خاص

الفصل له معنى فقط في سياق هندسة البرمجيات.في سياق هياكل البيانات والخوارزميات، لا يختلف الفصل والبنية كثيرًا.لا توجد أي قاعدة مقيدة بوجوب الإشارة إلى عضو الفصل.

عند تطوير مشروع كبير مع عدد كبير من الأشخاص بدون فئة، قد تحصل أخيرًا على كود مقترن معقد لأن الجميع يستخدمون أي وظائف وبيانات يريدونها.توفر الفئة عناصر تحكم في الأذونات وعناصر متأصلة لتحسين فك الارتباط وإعادة استخدام الرموز.

إذا قرأت بعض مبادئ هندسة البرمجيات، ستجد أن معظم المعايير لا يمكن تنفيذها بسهولة بدون دروس.على سبيل المثال:http://en.wikipedia.org/wiki/SOLID_%28object-Oriented_design%29

راجع للشغل، عندما تقوم البنية بتخصيص قدر كبير من الذاكرة وتتضمن عدة متغيرات، تشير متغيرات نوع القيمة إلى أن القيم مضمنة في المكان الذي تم تخصيص البنية فيه.في المقابل، تكون قيم متغير النوع المرجعي خارجية ويتم الرجوع إليها بواسطة مؤشر مضمن أيضًا في المكان الذي يتم تخصيص البنية فيه.

قد تفكر في ذلك للحصول على إرشادات حول متى تذهب إلى الهيكل أو الفصل الدراسي، https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

√ ضع في اعتبارك تعريف بنية بدلا من فئة إذا كانت مثيلات النوع صغير وعادة ما يكون قصير العمر أو مضمنا بشكل شائع في كائنات أخرى.

X تجنب تعريف بنية ما لم يكن النوع يحتوي على كل الخصائص التالية:

إنه يمثل منطقيا قيمة واحدة ، على غرار الأنواع البدائية (int ، مزدوجة ، إلخ).

لديها مثيل حجم أقل من 16 بايت.

إنه ثابت.

لن يكون من الضروري أن تكون محاصرة شكل متكرر.

الفرق بين البنية و فصل الكلمات الأساسية في C++ هي أنه عندما لا يكون هناك محدد محدد لنوع بيانات مركب معين، فسيتم ذلك بشكل افتراضي البنية أو اتحاد هي الكلمات الأساسية العامة التي تأخذ بعين الاعتبار إخفاء البيانات فقط، لكن الفئة هي الكلمة الأساسية الخاصة التي تأخذ في الاعتبار إخفاء رموز البرنامج أو البيانات.دائما ما يستخدمه بعض المبرمجين البنية للبيانات و فصل من أجل الكود.لمزيد من المعلومات اتصل بمصادر أخرى.

من بين كل هذه العوامل، يمكن أن نستنتج أن مفهوم الفصل مناسب للغاية لتمثيل كائنات العالم الحقيقي بدلاً من "الهياكل". ويرجع ذلك إلى حد كبير إلى أن مفاهيم OOP المستخدمة في الفصل عملية للغاية في شرح سيناريوهات العالم الحقيقي وبالتالي من الأسهل دمجها مع الواقع. على سبيل المثال، يكون الميراث الافتراضي عامًا للبنيات ولكن إذا طبقنا هذه القاعدة على العالم الحقيقي، فهذا أمر مثير للسخرية. ولكن في الفصل يكون الميراث الافتراضي خاصًا وهو أكثر واقعية.

على أي حال، ما أحتاج إلى تبريره هو أن الفصل هو مفهوم أوسع نطاقًا وقابل للتطبيق في العالم الحقيقي في حين أن الهيكل هو مفهوم بدائي ذو تنظيم داخلي ضعيف (على الرغم من أن الهيكل يتبع مفاهيم OOP، إلا أن لها معنى ضعيف)

الفرق الرئيسي بين الكلمة الأساسية للهيكل والفئة في عفوًا هو أنه لا يوجد إعلان عضو عام وخاص في الهيكل. ويمكن تعريف عضو البيانات ووظيفة العضو على أنهما عامان وخاصان ومحميان.

لقد وجدت فرقا آخر.إذا لم تقم بتعريف مُنشئ في الفصل الدراسي، فسيقوم المترجم بتعريفه.ولكن في البنية، إذا لم تقم بتعريف مُنشئ، فلن يقوم المترجم بتعريف مُنشئ أيضًا.لذلك في بعض الحالات التي لا نحتاج فيها حقًا إلى مُنشئ، فإن البنية هي الخيار الأفضل (نصيحة الأداء).و اعذرني على لغتي الانجليزية السيئة.

الفئات هي أنواع مرجعية والهياكل هي أنواع القيم.
عندما أقول الطبقات هي أنواع مرجعية،
في الأساس سوف تحتوي على عنوان متغيرات المثيل.

على سبيل المثال:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

في الطريقة الرئيسية،
يمكنني إنشاء مثيل لهذه الفئة باستخدام عامل تشغيل جديد يخصص الذاكرة لهذه الفئة
ويخزن العنوان الأساسي لذلك في متغير نوع MyClass (_myClassObject2).

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

في البرنامج أعلاه ، MyClass _myClassObject2 = _myClassObject1 ؛تشير التعليمات إلى أن كلا المتغيرين من النوع MyClass

  1. myClassObject1
  2. myClassObject2

وسوف يشير إلى نفس موقع الذاكرة.
يقوم بشكل أساسي بتعيين نفس موقع الذاكرة إلى متغير آخر من نفس النوع.

لذا، إذا كانت هناك أي تغييرات نقوم بها في أي من الكائنات، اكتب MyClass سيكون لها تأثير على كائن آخر
لأن كلاهما يشير إلى نفس موقع الذاكرة.

"_myClassObject1.DataMember = 10;" في هذا السطر سيحتوي كل من أعضاء بيانات الكائن على قيمة 10.
"_myClassObject2.DataMember = 20;" في هذا السطر سيحتوي كل من عضو بيانات الكائن على قيمة 20.
مؤخراً، نحن نصل إلى أعضاء البيانات في كائن ما من خلال المؤشرات.

على عكس الفئات، الهياكل هي أنواع القيمة.على سبيل المثال:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

في البرنامج أعلاه
إنشاء مثيل لكائن نوع MyStructure باستخدام عامل التشغيل الجديد و
تخزين العنوان في متغير _myStructObject من النوع MyStructure و
تعيين القيمة 10 لعضو البيانات في البنية باستخدام "_myStructObject1.DataMember = 10".

في السطر التالي،
أعلن عن متغير آخر _myStructObject2 من النوع MyStructure وقم بتعيين _myStructObject1 في ذلك.
هنا يقوم برنامج التحويل البرمجي .NET C# بإنشاء نسخة أخرى من كائن _myStructureObject1 و
يقوم بتعيين موقع الذاكرة هذا في متغير MyStructure _myStructObject2.

لذا فإن أي تغيير نقوم به على _myStructObject1 لن يكون له أي تأثير على متغير آخر _myStructObject2 من النوع MyStructrue.
لهذا السبب نقول أن الهياكل هي أنواع القيمة.

لذا فإن الفئة الأساسية المباشرة للفئة هي Object والفئة الأساسية المباشرة للهيكل هي ValueType الذي يرث من Object.
سوف تدعم الفصول الميراث بينما لن تدعم الهياكل ذلك.

كيف نقول ذلك؟
وما هو السبب وراء ذلك؟
الجواب هو الطبقات.

يمكن أن تكون مجردة ومختومة وثابتة وجزئية ولا يمكن أن تكون خاصة ومحمية ومحمية داخليًا.

الفرق الرئيسي بين البنية والفئة هو أنه في البنية يمكنك فقط الإعلان عن متغيرات البيانات من أنواع البيانات المختلفة بينما في الفصل يمكنك الإعلان عن متغيرات البيانات ووظائف الأعضاء وبالتالي يمكنك التعامل مع متغيرات البيانات من خلال الوظائف.

-> شيء مفيد آخر أجده في class vs struct هو أنه أثناء تنفيذ الملفات في البرنامج، إذا كنت تريد إجراء بعض العمليات للبنية مرارًا وتكرارًا في كل مجموعة جديدة من العمليات، فأنت بحاجة إلى إنشاء وظيفة منفصلة وتحتاج إلى تمرير كائن البنية بعد قراءته من الملف لإجراء بعض العمليات عليه.أثناء وجودك في الفصل، إذا قمت بإنشاء وظيفة تقوم ببعض العمليات على البيانات المطلوبة في كل مرة.. فمن السهل عليك فقط قراءة الكائن من الملف واستدعاء الوظيفة..

لكن ذلك يعتمد على المبرمج بالطريقة التي يجدها مناسبة... بالنسبة لي أفضل الفصل في كل مرة فقط لأنه يدعم OOPs وهذا هو السبب في أنه يتم تنفيذه في كل اللغات تقريبًا وهي الميزة الرائعة للبرمجة طوال الوقت؛- )

ونعم، الفرق الذي لا ينسى والذي نسيت أن أذكره هو أن الفصل يدعم إخفاء البيانات ويدعم أيضًا العمليات التي يتم إجراؤها على أنواع البيانات المضمنة بينما لا يدعم الهيكل ذلك!

**تحديث:** يرجى تجاهل هذا الرد.لم أفكر في احتمال أن تكون القيمة غير مهيأة للبنية ولكن تصادف أنها 0.لا يوجد فرق في التهيئة بين البنية والفئة.


أرى اختلافًا آخر بين البنيات والفئات المتعلقة بالتهيئة الافتراضية.

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

قم بتشغيل هذا الرمز وافحص myTester.ستجد أنه بالنسبة إلى m_Foo، تمت تهيئة البنية m_Foo.a إلى 0، ولكن بالنسبة إلى m_Bar، الفئة، m_Bar.a غير مهيأ.لذلك يبدو أن هناك اختلافًا في ما يفعله المنشئ الافتراضي للبنية مقابل ما يفعله المنشئ الافتراضي.فصل.أرى هذا مع Visual Studio.

هناك 3 اختلافات أساسية بين الهيكل والطبقة

1St- الذاكرة محجوزة للبنية في ذاكرة المكدس (التي هي قريبة من لغة البرمجة) سواء كانت الفئة في ذاكرة المكدس محجوزة للانكسار فقط والذاكرة الفعلية محجوزة في ذاكرة الكومة.

2Nd - يتم التعامل مع البنية الافتراضية على أنها عامة سواء تم التعامل مع الفئة على أنها خاصة.

3Rd- لا يمكن إعادة استخدام الكود في البنية ولكن في الفصل يمكننا إعادة استخدام نفس الكود في عدة مرات يسمى الوراثة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top