سؤال

لدي بعض الشكوك حول ضمانات أوامر التهيئة في البناء في C ++. على سبيل المثال ، يحتوي الكود التالي على أربع فئات X, Y, Z و W. تعمل الوظيفة الرئيسية على إنشاء كائن class X, الذي يحتوي على كائن class Y, ويستمد من class Z, ، لذلك سيتم استدعاء كلا المنشئين. بالإضافة إلى ذلك ، و const char* مرت المعلمة إلى Xسيتم تحويل مُنشئه ضمنيًا إلى كائن من class W, ، لذا Wيجب أن يطلق على مُنشئ.

ما هي الضمانات التي يعطيها معيار C ++ بترتيب المكالمات إلى منشئي النسخ؟ أو ، ما يعادل ، ما الذي يسمح له هذا البرنامج بطباعته؟

#include <iostream>

class Z {
   public:
   Z() { std::cout << "Z" << std::endl; }
};

class Y {
   public:
   Y() { std::cout << "Y" << std::endl; }
};

class W {
   public:
   W(const char*) { std::cout << "W" << std::endl; }
};

class X : public Z {
   public:
   X(const W&) { std::cout << "X" << std::endl; }
   private:
   Y y;
};

int main(int, char*[]) {
   X x("x");
   return 0;
}

تحرير: هل هذا صحيح؟

   W      |
 /   \    |
Z     Y   |
 \   /    |
   X      V
هل كانت مفيدة؟

المحلول

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

في مثالك X مشتق من Z ويحتوي Y لذلك Z تم بناء الكائن الأساسي أولاً ، ثم Y عضو y, ثم بناء X يكمل مع تنفيذ Xجسم مُنشئ.

المؤقتة W ضروري لتمرير مُنشئ X, ، لذلك يتم بناؤه قبل بناء x يبدأ وسيتم تدميره بمجرد تهيئة x يكمل.

لذلك يجب أن يطبع البرنامج:

W
Z
Y
X

نصائح أخرى

1) أولاً وقبل كل شيء ، هناك حاجة لحساب الحجج.

2) ثم يتم إنشاء فصول قاعدة.

3) ثم يتم بناء الأعضاء في ترتيب المظهر في إعلان الفصل.

4) ثم يسمى مُنشئ X

  1. سيتم بناء كائن W قبل استدعاء المُنشئ إلى X.
  2. ستتم تهيئة Z ، كفئة أساسية من X ، أمام أعضاء X.
  3. سيتم تفريغ y أثناء تهيئة الأعضاء
  4. سيتم تشغيل مُنشئ X.

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

لتلخيص هذه هي القواعد:

  1. الحجج ، مأخوذة من اليمين إلى اليسار
    أ. حق أكثر
    ب. الثاني من اليمين
  2. فئة قاعدة
  3. قاعدة افتراضية
  4. الفصول الأساسية من اليسار إلى اليمين
  5. الأعضاء من أجل الإعلان في الفصل
  6. مُنشئ الطبقة المسمى
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top