كيفية - مسائل محلوله في c++




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

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

Test* test = new Test;

و

Test* test = new Test();

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


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

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

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

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

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


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

Test t;      // create a Test called t

و

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

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

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


new Thing(); هو صريح أنك تريد منشئ يسمى في حين new Thing; يؤخذ في الاعتبار أنك لا تمانع إذا لم يتم استدعاء المنشئ.

في حالة استخدام على struct / class مع مُنشئ معرفة من قبل المستخدم ، لا يوجد فرق. إذا تم استدعاؤها على بنية / طبقة بسيطة (على سبيل المثال ، بناء struct Thing { int i; }; ) ، فإن الأمر new Thing; مثل malloc(sizeof(Thing)); في حين أن new Thing(); يشبه calloc(sizeof(Thing)); - يحصل على صفر تهيئة.

تقع مسكتك بين:

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;
};

سلوك new Thingy; مقابل new Thingy(); في هذه الحالة تغيرت بين C ++ 98 و C ++ 2003. انظر تفسير مايكل بور عن كيف ولماذا.





c++-faq