Saya ingin mengetahui aturan untuk menghilangkan struct (atau kelas) yang tidak memiliki konstruktor default di C++.
Secara khusus, tampaknya jika disimpan dalam tumpukan (misalnya, sebagai variabel lokal) variabel tersebut tidak diinisialisasi, tetapi jika dialokasikan di heap, variabel tersebut diinisialisasi nol (diuji dengan GCC 4.9.1). Apakah ini dijamin portabel?
Contoh program:
#include <iostream>
#include <map>
using namespace std;
struct X {
int i, j, k;
void show() { cout << i << " " << j << " " << k << endl; }
};
int fib(int i) {
return (i > 1) ? fib(i-1) + fib(i-2) : 1;
}
int main() {
map<int, X> m;
fib(10); // fills the stack with cruft
X x1; // local
X &x2 = m[1]; // heap-allocated within map
X *x3 = new X(); // explicitly heap-allocated
x1.show(); // --> outputs whatever was on the heap in those positions
x2.show(); // --> outputs 0 0 0
x3->show(); // --> outputs 0 0 0
return 0;
}
Diedit: menghapus "atau haruskah saya menggunakan konstruktor" di bagian yang dicetak tebal; karena yang membuat saya bertanya adalah saya ingin tahu apakah ini merupakan perilaku yang dijamin atau tidak - kita semua setuju bahwa kode yang dapat dibaca lebih baik dengan konstruktor eksplisit.
new X()
akan menginisialisasiX
, sedangkannew X
tidak (dalam kasus ini di manaX
merupakan agregat) - person Quentin   schedule 06.05.2015new X
) harus diutamakan - person maja   schedule 06.05.2015new X()
. Mengapa Anda lebih memilihnew X
? - person TartanLlama   schedule 06.05.2015X
diinisialisasi nilai (dinolkan), atau tidak ada yang dilakukan (konstruktor default sepele). Bagaimanapun, aturan inisialisasi adalah mimpi buruk, jadi gunakan saja konstruktor eksplisit dan selesaikan... - person Quentin   schedule 06.05.2015X()
. Dalam hal ini, kompiler akan menafsirkanX()
sebagai pemanggilan fungsi, sedangkannew X
selalu tidak ambigu. - person maja   schedule 06.05.2015()
tidak menyelamatkan Anda dari ambiguitas itu! - person Lightness Races in Orbit   schedule 06.05.2015A* a = new A();
setara denganA* a = new A;
bukan? Jika tidak ada konstruktor, yang default akan digunakan - tidak masalah apakah Anda menghilangkan tanda kurung atau tidak. - person maja   schedule 06.05.2015()
entah bagaimana menghindari ambiguitas; Saya menunjukkan, dengan contoh nyata, bahwa hal itu tidak terjadi. - person Lightness Races in Orbit   schedule 06.05.2015