Değer & varsayılan & sıfır başlatma konusunda kafam çok karışık. ve özellikle farklı standartlar C ++ 03 ve C ++ 11 (ve C ++ 14 ) için devreye girdiklerinde .
Burada gerçekten iyi bir cevabı alıntılamakta ve genişletmeye çalışıyorum Value- / Default- / Zero- Init C ++ 98 ve C ++ 03'ü daha genel hale getirmek için, çünkü birileri doldurmaya yardımcı olabilirse birçok kullanıcıya yardımcı olur. Ne zaman ne olacağı hakkında iyi bir genel bakışa sahip olmak için boşluklara ihtiyaç vardı?
Özetle örneklerle tam kavrayış:
Bazen yeni operatör tarafından döndürülen bellek başlatılır ve bazen yeni yazacağınız türün bir POD (düz eski veriler) olup olmadığına veya POD üyeleri içeren ve bir derleyici tarafından üretilen varsayılan yapıcı.
- In 1998 C ++ : başlatma 2 tipi vardır sıfır ve varsayılan başlatma
- Gelen 2003 C ++ başlatma, bir 3 tipi katma değer başlatma ilave edildi.
- In C ++ 2011 / C ++ 2014 tek liste başlatma eklendi ve kuralları değer-/ default- / sıfır başlatma biraz değişti.
Varsayalım:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
Bir C ++ 98 derleyicisinde aşağıdakiler gerçekleşmelidir :
new A- belirsiz değer (APOD'dur)new A()- sıfır başlatmanew B- varsayılan yapı (B::mbaşlatılmamış,BPOD değil)new B()- varsayılan yapı (B::mbaşlatılmamış)new C- varsayılan yapı (C::msıfır başlatılmıştır,CPOD değildir)new C()- varsayılan yapı (C::msıfır başlatılmış)new D- varsayılan yapı (D::mbaşlatılmamış,DPOD değil)new D()- varsayılan yapı? (D::mbaşlatılmamış)
Bir C ++ 03 uyumlu derleyicide, işler şu şekilde çalışmalıdır:
new A- belirsiz değer (APOD'dur)new A()- value-initializeA, bu bir POD olduğundan sıfır başlatmadır.new B- varsayılan olarak başlatılır (B::mbaşlatılmamış bırakır ,BPOD değildir)new B()-Bvarsayılan ctor kullanıcı tanımlı yerine derleyici oluşturulduğundan, tüm alanları sıfır olarak başlatan değer.new C- default-başlatılırC, varsayılan ctor'u çağırır. (C::msıfır başlatılmış,CPOD değil)new C()- değer başlatılırC, varsayılan ctor'u çağırır. (C::msıfır başlatılmış)new D- varsayılan yapı (D::mbaşlatılmamış,DPOD değil)new D()- değer D'yi başlatır? , varsayılan ctor'u çağıran (D::mbaşlatılmamış)
İtalik değerler ve? belirsizlik var, lütfen bunu düzeltmeye yardım edin :-)
Bir C ++ 11 uyumlu derleyicide, işler şu şekilde çalışmalıdır:
??? (lütfen yardım edin, buradan başlarsam yine de ters gidecek)
Bir C ++ 14 uyumlu derleyicide, işler şu şekilde çalışmalıdır: ??? (lütfen buradan başlarsam yardım edin, yine de yanlış gidecek) (Yanıta göre taslak)
new A- varsayılan başlatırA, derleyici gen. ctor, (A::mbaşlatılmamış olarak kalır ) (POD'durA)new A()- değer başlatılırA, bu, [dcl.init] / 8'deki 2. noktadan beri sıfır başlatmadırnew B- varsayılan başlatırB, derleyici gen. ctor, (B::mbaşlatılmamış olarak kalır ) (BPOD değildir)new B()-Bvarsayılan ctor kullanıcı tanımlı yerine derleyici oluşturulduğundan, tüm alanları sıfır olarak başlatan değer.new C- default-başlatılırC, varsayılan ctor'u çağırır. (C::msıfır başlatılmış,CPOD değil)new C()- değer başlatılırC, varsayılan ctor'u çağırır. (C::msıfır başlatılmış)new D- varsayılan olarak başlatılırD(D::mbaşlatılmamış,DPOD değil)new D()- değer başlatılırD, varsayılan ctor'u çağırır (D::mbaşlatılmamıştır)new E- varsayılan olarak başlatılırE, bu da comp'i çağırır. gen. ctor. (E::mbaşlatılmamış, E, POD değil)new E()- [dcl.init] / 8'de 2 noktadan beriEsıfır olarak başlayan değer başlatılır )Enew F- varsayılan olarak başlatılırF, bu da comp'i çağırır. gen. ctor. (F::mbaşlatılmamış,FPOD değil)new F()- değer başlatılırkenF, varsayılan-başlatılırkenF1. nokta beri [dcl.init] / 8 (Fo kullanıcısının bildirdiği ve açıkça varsayılan veya ilk bildiriminde silinmiş ise ctor fonksiyonu kullanıcı tarafından sağlanan olduğunu. Bağlantı )