c++ معنى - ما هي جميع وظائف الأعضاء التي أنشأها المترجم لفئة؟ هل هذا يحدث طوال الوقت؟




كلمة بالعربية (5)

ما هي جميع وظائف الأعضاء التي أنشأها المترجم لفئة؟ هل هذا يحدث طوال الوقت؟ مثل المدمر ما يهمني هو ما إذا كان يتم إنشاؤه لجميع الفئات ، ولماذا هناك حاجة إلى منشئ الافتراضي؟


Answers

C ++ 98/03

إذا كانت هناك حاجة إليها ،

  1. سيقوم المترجم بإنشاء مُنشئ افتراضي لك إلا إذا قمت بإعلان أي مُنشئ خاص بك.
  2. سوف يقوم المترجم بتوليد منشئ نسخة لك ما لم تعلن بنفسك.
  3. سوف يقوم المترجم بإنشاء مشغل تخصيص نسخة لك ما لم تقم بتعريفه بنفسك.
  4. سوف يقوم المترجم بتوليد مدمر لك إلا إذا قمت بالإعلان عن هويتك.

كما قال Péter في تعليق مفيد ، يتم إنشاء كل تلك فقط من قبل المترجم عند الحاجة إليها . (الفرق هو أنه عندما لا يتمكن المترجم من إنشائها ، هذا طيب طالما لم يتم استخدامها).

C ++ 11

يضيف C ++ 11 القواعد التالية ، والتي تنطبق أيضًا على C ++ 14 (اعتمادات to towi ، انظر هذا التعليق ) :

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

لاحظ أن هذه القواعد أكثر تفصيلاً من قواعد C ++ 03 وأن تكون منطقية أكثر من الناحية العملية.

لتسهيل فهم ما هو موضح أعلاه ، ما هي العناصر الموجودة هنا؟

class Thing {
public:
    Thing();                        // default constructor
    Thing(const Thing&);            // copy c'tor
    Thing& operator=(const Thing&); // copy-assign
    ~Thing();                       // d'tor
    // C++11:
    Thing(Thing&&);                 // move c'tor
    Thing& operator=(Thing&&);      // move-assign
};

وكمزيد من القراءة ، إذا كنت C ++ - فالمبتدئين يفكر في التصميم الذي لا يتطلب منك تنفيذ أي من الخمسة الأخيرة ، ويعرف أيضا باسم "حكم الصفر" (من قبل Martinho Fernandes ) .


هل تقصد "معرفة" من خلال "تم إنشاؤه"؟

12.1 دولار - "المنشئ الافتراضي (12.1) ، ومنشئ النسخ ومشغل تخصيص النسخة (12.8) ، و destructor (12.4) هي وظائف خاصة بالأعضاء.

إذا كانت كلمة "created" تعني "معرفة" ، فإليك الأجزاء المهمة من C ++ Standard.

-منحني ضمنيًا ، مُنشئ افتراضي مفترض ضمنيًا لفئة ما ، يتم استخدامه ضمنيًا عند استخدامه لإنشاء كائن من نوع الفئة (1.8).

- إذا لم يكن للفصل دستور معلن من قبل المستخدم ، فيتم الإعلان عن تدميره ضمنيًا. يتم تعريف destructor ضمنيًا ضمنيًا عند استخدامه لتدمير كائن من نوع الفئة الخاصة به.

- إذا كان تعريف الفئة لا يعلن صراحة عن منشئ نسخة ، يتم الإعلان عن ذلك بشكل ضمني. يتم تعريف مُنشئ نسخة مُصرح ضمنيًا ضمنيًا إذا تم استخدامه لتهيئة كائن من نوع الفئة الخاصة به من نسخة من كائن من نوع الفئة الخاصة به أو من نوع فئة مشتق من نوع الفئة الخاصة به).

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


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

  • منشئ افتراضي
  • منشئ نسخة
  • مشغل نسخ (مهمة)
  • المدمر

واعتمادًا على أنواع الأعضاء وأي من وظائف الأعضاء المذكورة في القائمة ، فإنك لن تُنشئ جميعها.


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

ما يهمني هو ما إذا كان يتم إنشاؤه لجميع الطبقات ...

لماذا قلق؟ هل تعتقد أنها تنشئ كودًا غير مرغوب فيه في الملف القابل للتنفيذ؟ من غير المحتمل ، ولكن يمكنك التحقق بسهولة كافية مع البيئة الخاصة بك.

أو ربما كان قلقك هو أنها قد لا تنشئ مُنشئًا عندما تريد واحدة؟ لا داعي للقلق ... حيث يتم إنشاؤها دائمًا إذا لزم الأمر ولم يوفرها المستخدم.

... ولماذا هو منشئ افتراضي حاجة؟

لأن الطبقات قد تحتوي على كائنات بداخلها مع دمارها الخاص بها والتي يجب أن يتم استدعاؤها بشكل منتظم. على سبيل المثال ، معطى ...

struct X
{
    std::string a;
    std::string b;
};

... destructor الافتراضي يتأكد من destructors a و b المدى.


أستخدم المراجع ما لم أحتاج إلى أي من هذين الأمرين:

  • يمكن استخدام مؤشرات فارغة كقيمة الحارس ، غالباً طريقة رخيصة لتجنب التحميل الزائد للوظيفة أو استخدام bool.

  • يمكنك أن تفعل الحساب على مؤشر. فمثلا،p += offset;





c++ compiler-construction member-functions c++-faq