c++ هل تحدث الأقواس بعد اسم النوع فرقًا جديدًا؟




constructor initialization (4)

بشكل عام لدينا التهيئة الافتراضية في الحالة الأولى وتهيئة القيمة في الحالة الثانية.

على سبيل المثال: في حالة int (نوع POD):

  • int* test = new int - لدينا أي تهيئة وقيمة * اختبار يمكن أن يكون أي.

  • int* test = new int() - * سيكون للاختبار 0 قيمة.

السلوك القادم يعتمد على نوع اختبار. لدينا حالات غختلاف: اختبار لها منشئ defult ، وقد ولدت اختبار منشئ افتراضي ، اختبار تحتوي على عضو POD ، عضو غير POD ...

إذا كان "الاختبار" فئة عادية ، فهل هناك فرق بين:

Test* test = new Test;

و

Test* test = new Test();

لا، إنهم متشابهون. ولكن هناك فرق بين:

Test t;      // create a Test called t

و

Test t();   // declare a function called t which returns a Test

هذا بسبب القاعدة الأساسية لـ C ++ (و C): إذا كان من الممكن أن يكون هناك تصريح ، فيكون الإعلان.

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


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

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

  • في C ++ 1998 هناك نوعان من التهيئة: صفر و الافتراضي
  • في C ++ 2003 نوع ثالث من التهيئة ، تمت إضافة قيمة التهيئة.

افترض:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

في مترجم C ++ 98 ، يجب أن يحدث ما يلي:

  • new A - قيمة غير محددة
  • new A() - صفر تهيئة

  • new B - البنية الافتراضية (B :: m غير مهيأ)

  • new B() - البنية الافتراضية (B :: m غير مهيأ)

  • new C - بناء افتراضي (C :: m هو صفر تهيئة)

  • new C() - البنية الافتراضية (C :: m غير صفرية التهيئة)

في مترجم compiler C ++ 03 ، يجب أن تعمل الأشياء مثل:

  • new A - قيمة غير محددة
  • new A() - تهيئة القيمة A ، وهي تهيئة صفر حيث إنها POD.

  • new B - الإعداد الافتراضي - يبدأ (يترك B :: m غير مهيأ)

  • new B() - value-initializes B الذي يقوم بتهيئة الصفر لكافة الحقول حيث أن ctor الافتراضي لها هو مترجم تم إنشاؤه بدلاً من تعريف المستخدم.

  • new C - يهيئ الإعداد الافتراضي C ، والذي يستدعي القيمة الافتراضية.

  • new C() - القيمة-تهيئة C ، الذي يستدعي ctor الافتراضي.

لذلك في جميع إصدارات C ++ هناك فرق بين new A new A() و new A() لأن A هو POD.

وهناك اختلاف في السلوك بين C ++ 98 و C ++ 03 لحالة new B() .

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


بافتراض أن الاختبار هو فئة مع مُنشئ محدد ، لا يوجد فرق. الشكل الأخير يجعل الأمر أكثر وضوحًا من أن مُنشئ Test قيد التشغيل ، ولكن هذا هو الأمر.





c++-faq