سؤال

قرأت كتابًا S. Lippman "Inside C ++ Object Model" ، هل هناك رمز مثل هذا

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

وتقول أن "المُنشئ الافتراضي لا يتم تصنيعه في جزء الرمز هذا.

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

في هذا الرمز ، تم إنشاء كائن BAZ على الكومة ، ووفقًا لما قيل أعلاه ، فإن هذا الكائن ليس عالميًا ولن يطلق عليه المُنشئ الافتراضي. أنا أفهم بشكل صحيح ؟

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

المحلول

الأقواس في new Foo() حدد تهيئة القيمة; ؛ هذا يعني في الأساس أن كل عضو لا يعاني من صفر. إذا قلت بدلاً من ذلك new Foo, ، ثم يتم ترك الأعضاء غير مهتمين ، كما هو الحال مع المتغير التلقائي الخاص بك.

لسوء الحظ ، للحصول على قيمة المتغير التلقائي ، لا يمكنك الكتابة Foo bar(), ، لأن ذلك يعلن وظيفة. انك سوف تحتاج

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++

نصائح أخرى

عندما تفعل هذا:

Foo* baz = new Foo();

أنت تقوم بتخصيص ديناميكي Foo على سبيل المثال و القيمة المتبعة هو - هي. بالنسبة للقرون ، هذا يعني أن الأعضاء يحصلون على صفر. إذا كنت قد قلت هذا (على افتراض سياق غير عازف):

Foo* baz = new Foo;

ثم Foo سيتم تهيئة الحالة الافتراضية ، مما يعني أنه لا يتم تنفيذ تهيئة أعضائه ، نظرًا لأنهم قرون.

ينطبق هذا أيضًا على مثيلات التخزين التلقائية:

Foo f0; // default initializaiton: members not zeroed out.
Foo f1 = Foo(); // value initialization: members zeroed out.
Foo f2{}; // C++11 value initialization: members zeroed out.
Foo f3(); // Ooops! Function declaration. Something completely different.

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

ما إضافة مجموعة فارغة من الأقواس في new Foo() هل ، هو تقييم تهيئة الكائن المخصص ، مما يعني تهيئة الأعضاء إلى قيمهم "الافتراضية" ، والتي هي صفر لقيم عدد صحيح وقيم عائمة ، و nullptr للمؤشرات.

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