Pertama, izinkan saya menjelaskan apa itu mem-initializer-list . Sebuah daftar mem-initializer- adalah daftar dipisahkan koma mem-initializer s, di mana masing-masing mem-initializer adalah nama anggota diikuti oleh (
, diikuti oleh ekspresi-daftar , diikuti oleh )
. Daftar ekspresi adalah bagaimana anggota dibangun. Misalnya, dalam
static const char s_str[] = "bodacydo";
class Example
{
private:
int *ptr;
string name;
string *pname;
string &rname;
const string &crname;
int age;
public:
Example()
: name(s_str, s_str + 8), rname(name), crname(name), age(-4)
{
}
};
yang mem-initializer-list dari yang disediakan pengguna, tidak ada argumen konstruktor adalah name(s_str, s_str + 8), rname(name), crname(name), age(-4)
. Ini mem-initializer-list berarti bahwa name
anggota diinisialisasi oleh para std::string
konstruktor yang mengambil dua iterator masukan , yang rname
anggota diinisialisasi dengan mengacu name
, pada crname
anggota diinisialisasi dengan const-referensi name
, dan age
anggota diinisialisasi dengan nilai -4
.
Setiap konstruktor memiliki mem-inisialisasi-daftar sendiri , dan anggota hanya dapat diinisialisasi dalam urutan yang ditentukan (pada dasarnya urutan di mana anggota dinyatakan dalam kelas). Dengan demikian, para anggota Example
dapat hanya diinisialisasi dalam urutan: ptr
, name
, pname
, rname
, crname
, dan age
.
Ketika Anda tidak menentukan mem-initializer anggota, standar C ++ mengatakan:
Jika entitas adalah anggota data tidak statis ... dari tipe kelas ..., entitas tersebut diinisialisasi-awal (8.5). ... Kalau tidak, entitas tidak diinisialisasi.
Di sini, karena name
merupakan anggota data non-statis dari tipe kelas, ini diinisialisasi-standar jika tidak ada initializer untuk name
ditentukan dalam daftar mem-initializer-list . Semua anggota lain Example
tidak memiliki tipe kelas, jadi mereka tidak diinisialisasi.
Ketika standar mengatakan bahwa mereka tidak diinisialisasi, ini berarti bahwa mereka dapat memiliki nilai apa pun . Jadi, karena kode di atas tidak menginisialisasi pname
, bisa jadi apa saja.
Perhatikan bahwa Anda masih harus mengikuti aturan lain, seperti aturan bahwa referensi harus selalu diinisialisasi. Ini adalah kesalahan kompiler untuk tidak menginisialisasi referensi.