Сначала позвольте мне объяснить, что такое mem-initializer-list . Список MEM-инициализатор- это разделенный запятыми список MEM-инициализатор с, где каждый MEM-инициализатор представляет собой имя элемента с последующим (
, с последующим выражением-лист , за которым следует )
. Список выражений - это то, как создается член. Например, в
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)
{
}
};
ает-инициализатор-лист конструктора предоставленного пользователя, не-аргументы name(s_str, s_str + 8), rname(name), crname(name), age(-4)
. Этот MEM-инициализатор-списка означает , что name
элемент инициализируется в std::string
конструкторе , который принимает два входных итераторов , то rname
элемент инициализируется со ссылкой name
, то crname
элемент инициализируется с константной-ссылкой name
, а age
элемент инициализируются со значением -4
.
Каждый конструктор имеет свой собственный список mem-initializer-list , и члены могут быть инициализированы только в установленном порядке (в основном, в порядке, в котором члены объявлены в классе). Таким образом, члены Example
могут быть инициализированы только в следующем порядке: ptr
, name
, pname
, rname
, crname
, и age
.
Когда вы не указываете mem-инициализатор члена, стандарт C ++ говорит:
Если сущность является нестатическим элементом данных ... типа класса ..., сущность инициализируется по умолчанию (8.5). ... В противном случае сущность не инициализируется.
Здесь, поскольку name
это нестатический член данных типа класса, он инициализируется по умолчанию, если name
в списке mem-initializer-list не указан инициализатор для . Все остальные члены класса Example
не имеют типа класса, поэтому они не инициализируются.
Когда стандарт говорит, что они не инициализированы, это означает, что они могут иметь любое значение. Таким образом, поскольку приведенный выше код не инициализируется pname
, это может быть что угодно.
Обратите внимание, что вы все равно должны следовать другим правилам, таким как правило, что ссылки всегда должны быть инициализированы. Это ошибка компилятора, чтобы не инициализировать ссылки.