Trước tiên, hãy để tôi giải thích danh sách mem-initializer-danh sách là gì. Một mem-initializer-list 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-list, tiếp theo là một )
. biểu thức danh sách 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 có nghĩa là thành viên name
được khởi tạo bởi the std::string
constructor that takes two input iterators, thành viên rname
đượ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 thành viên age
được khởi tạo với giá trị -4
.
Mỗi hàm tạo có danh sách khởi tạo mem- riêng của mình và các thành viên chỉ có thể được khởi tạo theo thứ tự quy định (về cơ bản 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 một mem-initializer của một thành viên, tiêu chuẩn C++ nói:
Nếu đơn vị là thành viên dữ liệu không tĩnh ... của kiểu lớp ..., đơn vị được khởi tạo mặc định (8.5). ... Nếu không, thực thể không được khởi tạo.
Tại đây, vì name
là thành viên dữ liệu không tĩnh của kiểu lớp, nó là mặc định khởi tạo nếu không khởi tạo cho name
được quy định trong mem-initializer-list. Tất cả các thành viên khác của 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 cho biết rằng chúng không được khởi tạo, điều này có nghĩa là chúng có thể có giá trị bất kỳ. Vì vậy, vì mã trên không khởi tạo pname
, nó có thể là bất cứ điều gì.
Lưu ý rằng bạn vẫn phải tuân thủ các quy tắc khác, chẳng hạn như quy tắc tham chiếu phải luôn được khởi tạo. Nó là một lỗi trình biên dịch để không khởi tạo tài liệu tham khảo.
Để biết các khuyến nghị về sách, hãy xem http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –
Mike, ow, ý tôi là chương từ một số cuốn sách giải thích nó. Không phải toàn bộ cuốn sách! :) – bodacydo
Có lẽ sẽ là một ý tưởng hay khi đọc toàn bộ cuốn sách về ngôn ngữ bạn dự định lập trình. Và nếu bạn đã đọc và nó không giải thích được điều này, thì đó không phải là một cuốn sách hay. –