Đầu tiên, hãy để tôi giải thích danh sách mem-khởi tạo là gì. Một danh sách mem-initializer- là một danh sách bằng dấu phẩy của mem-initializer s, trong đó mỗi mem-initializer là một tên thành viên tiếp theo (
, tiếp theo là một biểu hiện danh sách , theo sau là một )
. Các biểu hiện-list là cách thành viên được xây dựng. Ví dụ: trong
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)
{
}
};
các mem-initializer-list của các nhà xây dựng người dùng cung cấp, không có đối số là name(s_str, s_str + 8), rname(name), crname(name), age(-4)
. Đây mem-initializer-list phương tiện mà các name
thành viên được khởi tạo bởi các std::string
nhà xây dựng mà phải mất hai vòng lặp đầu vào , các rname
thành viên được khởi tạo với một tham chiếu đến name
, các crname
thành viên được khởi tạo với một const-tham chiếu đến name
, và các age
thành viên được khởi tạo với giá trị -4
.
Mỗi constructor có danh sách mem-khởi tạo riêng và các thành viên chỉ có thể được khởi tạo theo thứ tự quy định (về cơ bản là thứ tự các thành viên được khai báo trong lớp). Do đó, các thành viên của Example
chỉ có thể được khởi tạo theo thứ tự: ptr
, name
, pname
, rname
, crname
, và age
.
Khi bạn không chỉ định trình khởi tạo mem của thành viên, tiêu chuẩn C ++ sẽ nói:
Nếu thực thể là thành viên dữ liệu phi tập trung ... thuộc loại lớp ..., thì thực thể được khởi tạo mặc định (8.5). ... Mặt khác, thực thể không được khởi tạo.
Ở đây, vì name
là thành viên dữ liệu phi tập trung của loại lớp, nên nó được khởi tạo mặc định nếu không có trình khởi tạo nào name
được chỉ định trong danh sách mem-khởi tạo . Tất cả các thành viên khác Example
không có loại lớp, vì vậy chúng không được khởi tạo.
Khi tiêu chuẩn nói rằng chúng không được khởi tạo, điều này có nghĩa là chúng có thể có bất kỳ giá trị nào . Do đó, vì đoạn mã trên không khởi tạo pname
, nó có thể là bất cứ thứ gì.
Lưu ý rằng bạn vẫn phải tuân theo các quy tắc khác, chẳng hạn như quy tắc rằng các tham chiếu phải luôn được khởi tạo. Đó là một lỗi biên dịch để không khởi tạo tài liệu tham khảo.