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 (A
POD'dur)new A()
- sıfır başlatmanew B
- varsayılan yapı (B::m
başlatılmamış,B
POD değil)new B()
- varsayılan yapı (B::m
başlatılmamış)new C
- varsayılan yapı (C::m
sıfır başlatılmıştır,C
POD değildir)new C()
- varsayılan yapı (C::m
sıfır başlatılmış)new D
- varsayılan yapı (D::m
başlatılmamış,D
POD değil)new D()
- varsayılan yapı? (D::m
başlatılmamış)
Bir C ++ 03 uyumlu derleyicide, işler şu şekilde çalışmalıdır:
new A
- belirsiz değer (A
POD'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::m
başlatılmamış bırakır ,B
POD değildir)new B()
-B
varsayı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::m
sıfır başlatılmış,C
POD değil)new C()
- değer başlatılırC
, varsayılan ctor'u çağırır. (C::m
sıfır başlatılmış)new D
- varsayılan yapı (D::m
başlatılmamış,D
POD değil)new D()
- değer D'yi başlatır? , varsayılan ctor'u çağıran (D::m
baş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::m
baş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::m
başlatılmamış olarak kalır ) (B
POD değildir)new B()
-B
varsayı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::m
sıfır başlatılmış,C
POD değil)new C()
- değer başlatılırC
, varsayılan ctor'u çağırır. (C::m
sıfır başlatılmış)new D
- varsayılan olarak başlatılırD
(D::m
başlatılmamış,D
POD değil)new D()
- değer başlatılırD
, varsayılan ctor'u çağırır (D::m
başlatılmamıştır)new E
- varsayılan olarak başlatılırE
, bu da comp'i çağırır. gen. ctor. (E::m
başlatılmamış, E, POD değil)new E()
- [dcl.init] / 8'de 2 noktadan beriE
sıfır olarak başlayan değer başlatılır )E
new F
- varsayılan olarak başlatılırF
, bu da comp'i çağırır. gen. ctor. (F::m
başlatılmamış,F
POD değil)new F()
- değer başlatılırkenF
, varsayılan-başlatılırkenF
1. nokta beri [dcl.init] / 8 (F
o 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ı )