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 nameanggota diinisialisasi oleh para std::stringkonstruktor yang mengambil dua iterator masukan , yang rnameanggota diinisialisasi dengan mengacu name, pada crnameanggota diinisialisasi dengan const-referensi name, dan ageanggota 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 Exampledapat 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 namemerupakan anggota data non-statis dari tipe kelas, ini diinisialisasi-standar jika tidak ada initializer untuk nameditentukan dalam daftar mem-initializer-list . Semua anggota lain Exampletidak 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.