Saya sangat bingung tentang nilai- & default- & nol-inisialisasi. dan terutama ketika mereka menendang untuk standar yang berbeda C ++ 03 dan C ++ 11 (dan C ++ 14 ).
Saya mengutip dan mencoba untuk memperluas jawaban yang sangat bagus Value- / Default- / Zero- Init C ++ 98 dan C ++ 03 di sini untuk membuatnya lebih umum karena akan membantu banyak pengguna jika seseorang dapat membantu mengisi celah yang dibutuhkan untuk mendapatkan gambaran yang baik tentang apa yang terjadi dan kapan?
Wawasan lengkap dengan contoh singkatnya:
Terkadang memori yang dikembalikan oleh operator baru akan diinisialisasi, dan terkadang tidak tergantung pada apakah jenis yang Anda perbarui adalah POD (data lama biasa) , atau jika itu adalah kelas yang berisi anggota POD dan menggunakan compiler-generated default constructor.
- Di C ++ 1998 ada 2 jenis inisialisasi: nol- dan default-inisialisasi
- Dalam C ++ 2003 tipe ketiga inisialisasi, nilai-inisialisasi ditambahkan.
- Di C ++ 2011 / C ++ 2014 hanya inisialisasi daftar yang ditambahkan dan aturan untuk nilai- / default- / zero-inisialisasi berubah sedikit.
Menganggap:
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 */
Dalam kompiler C ++ 98, hal berikut harus terjadi :
new A- nilai tak tentu (Aadalah POD)new A()- nol-menginisialisasinew B- konstruksi default (B::mtidak diinisialisasi,Bbukan POD)new B()- konstruksi default (B::mtidak diinisialisasi)new C- konstruksi default (C::mdiinisialisasi nol,Cnon-POD)new C()- konstruksi default (C::mdiinisialisasi nol)new D- konstruksi default (D::mtidak diinisialisasi,Dbukan POD)new D()- konstruksi default? (D::mtidak dimulai)
Dalam kompilator konforman C ++ 03, hal-hal akan bekerja seperti ini:
new A- nilai tak tentu (Aadalah POD)new A()- value-initializeA, yang merupakan inisialisasi nol karena ini adalah POD.new B- default-inisialisasi (B::mtidak diinisialisasi,Bnon-POD)new B()- value-initializesByang menginisialisasi nol semua bidang karena ctor defaultnya adalah kompilator yang dihasilkan sebagai lawan yang ditentukan pengguna.new C- default-inisialisasiC, yang memanggil ctor default. (C::mtidak diinisialisasi,Cbukan POD)new C()- nilai-menginisialisasiC, yang memanggil ctor default. (C::mdiinisialisasi nol)new D- konstruksi default (D::mtidak diinisialisasi,Dbukan POD)new D()- nilai-menginisialisasi D? , yang memanggil ctor default (D::mtidak diinisialisasi)
Nilai miring dan? adalah ketidakpastian, tolong bantu untuk memperbaikinya :-)
Dalam compiler konforman C ++ 11, semuanya akan bekerja seperti ini:
??? (tolong bantu jika saya mulai di sini tetap saja akan salah)
Dalam kompilator konforman C ++ 14, hal-hal harus bekerja seperti ini: ??? (tolong bantu jika saya mulai di sini tetap saja akan salah) (Draf berdasarkan jawaban)
new A- default-inisialisasiA, compiler gen. ctor, (leavsA::muninitialized) (Aadalah POD)new A()- nilai-menginisialisasiA, yang merupakan inisialisasi nol sejak 2. titik di [dcl.init] / 8new B- default-inisialisasiB, kompilator gen. ctor, (leavsB::muninitialized) (Bnon-POD)new B()- value-initializesByang menginisialisasi nol semua bidang karena ctor defaultnya adalah kompilator yang dihasilkan sebagai lawan yang ditentukan pengguna.new C- default-inisialisasiC, yang memanggil ctor default. (C::mtidak diinisialisasi,Cbukan POD)new C()- nilai-menginisialisasiC, yang memanggil ctor default. (C::mdiinisialisasi nol)new D- default-inisialisasiD(D::mtidak diinisialisasi,Dbukan POD)new D()- value-initializesD, yang memanggil ctor default (D::mtidak diinisialisasi)new E- default-inisialisasiE, yang memanggil comp. gen. ctor. (E::mtidak diinisialisasi, E bukan POD)new E()- nilai-menginisialisasiE, yang menginisialisasi nolEsejak 2 titik di [dcl.init] / 8 )new F- default-inisialisasiF, yang memanggil comp. gen. ctor. (F::mtidak diinisialisasi,Fbukan POD)new F()- nilai-menginisialisasiF, yang menginisialisasi defaultFsejak 1. titik di [dcl.init] / 8 (Ffungsi ctor disediakan pengguna jika dideklarasikan oleh pengguna dan tidak secara eksplisit default atau dihapus pada deklarasi pertamanya. Tautan )