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 (A
adalah POD)new A()
- nol-menginisialisasinew B
- konstruksi default (B::m
tidak diinisialisasi,B
bukan POD)new B()
- konstruksi default (B::m
tidak diinisialisasi)new C
- konstruksi default (C::m
diinisialisasi nol,C
non-POD)new C()
- konstruksi default (C::m
diinisialisasi nol)new D
- konstruksi default (D::m
tidak diinisialisasi,D
bukan POD)new D()
- konstruksi default? (D::m
tidak dimulai)
Dalam kompilator konforman C ++ 03, hal-hal akan bekerja seperti ini:
new A
- nilai tak tentu (A
adalah POD)new A()
- value-initializeA
, yang merupakan inisialisasi nol karena ini adalah POD.new B
- default-inisialisasi (B::m
tidak diinisialisasi,B
non-POD)new B()
- value-initializesB
yang 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::m
tidak diinisialisasi,C
bukan POD)new C()
- nilai-menginisialisasiC
, yang memanggil ctor default. (C::m
diinisialisasi nol)new D
- konstruksi default (D::m
tidak diinisialisasi,D
bukan POD)new D()
- nilai-menginisialisasi D? , yang memanggil ctor default (D::m
tidak 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::m
uninitialized) (A
adalah POD)new A()
- nilai-menginisialisasiA
, yang merupakan inisialisasi nol sejak 2. titik di [dcl.init] / 8new B
- default-inisialisasiB
, kompilator gen. ctor, (leavsB::m
uninitialized) (B
non-POD)new B()
- value-initializesB
yang 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::m
tidak diinisialisasi,C
bukan POD)new C()
- nilai-menginisialisasiC
, yang memanggil ctor default. (C::m
diinisialisasi nol)new D
- default-inisialisasiD
(D::m
tidak diinisialisasi,D
bukan POD)new D()
- value-initializesD
, yang memanggil ctor default (D::m
tidak diinisialisasi)new E
- default-inisialisasiE
, yang memanggil comp. gen. ctor. (E::m
tidak diinisialisasi, E bukan POD)new E()
- nilai-menginisialisasiE
, yang menginisialisasi nolE
sejak 2 titik di [dcl.init] / 8 )new F
- default-inisialisasiF
, yang memanggil comp. gen. ctor. (F::m
tidak diinisialisasi,F
bukan POD)new F()
- nilai-menginisialisasiF
, yang menginisialisasi defaultF
sejak 1. titik di [dcl.init] / 8 (F
fungsi ctor disediakan pengguna jika dideklarasikan oleh pengguna dan tidak secara eksplisit default atau dihapus pada deklarasi pertamanya. Tautan )