Сначала позвольте мне объяснить, что такое 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, это может быть что угодно.
Обратите внимание, что вы все равно должны следовать другим правилам, таким как правило, что ссылки всегда должны быть инициализированы. Это ошибка компилятора, чтобы не инициализировать ссылки.