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