首先,让我解释一下什么是mem-initializer-list。一个mem-initializer-list是一个以逗号分隔的mem-initializer列表,其中每个mem-initializer是一个成员名称(
,后跟一个expression-list,然后一个a )
。的表达式列表是构件是如何构造的。例如,在
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
成员使用value进行初始化-4
。
每个构造函数都有自己的mem-initializer-list,并且只能按规定的顺序(基本上是在类中声明成员的顺序)初始化成员。因此,成员Example
只能在顺序进行初始化:ptr
,name
,pname
,rname
,crname
,和age
。
当您不指定成员的mem-initializer时,C ++标准会说:
如果实体是类类型为...的非静态数据成员,则该实体将进行默认初始化(8.5)。...否则,实体未初始化。
在这里,由于name
是类类型的非静态数据成员,因此如果未name
在mem-initializer-list中指定初始化器,则将默认初始化。的所有其他成员Example
没有类类型,因此它们没有初始化。
当标准说它们没有被初始化时,这意味着它们可以具有任何值。因此,由于上述代码未初始化pname
,因此可以是任何东西。
请注意,您仍然必须遵循其他规则,例如必须始终对引用进行初始化的规则。不初始化引用是编译器错误。