我看到了两种使用成员初始化器列表的不同方法。第一个是这样的:
class ClassName {
public:
arg_type_1 varName1;
arg_type_2 varName2;
// Constructor.
ClassName(arg_type_1 arg_name_1, arg_type_2 arg_name_2)
: varName1(arg_name_1), varName2(arg_name_2)
{
}
}
那里发生的事情很清楚。在构造函数中,我们有一个参数列表,我们使用它们来初始化类的成员。例如arg_name_1
用于初始化varName1
类变量的值。
在继承的情况下出现了另一种使用成员初始值设定项的方法:
class ChildClass : public ParentClass
{
ChildClass(string name) : ParentClass( name )
{
// What can we put here and why we might need it.
}
};
这里发生的事情也很清楚。当我们ChildClass
用一个字符串参数调用 的构造函数时,它ParentClass
用相同的字符串参数调用 的构造函数。
我不清楚的是编译器如何区分这两种情况(语法相同)。例如,在第二个示例中,编译器可能认为它需要获取变量的name
值并将其分配给 的ParentClass
变量,ChildClass
然后它会看到这样的变量没有在ChildClass
.
我不清楚的第二点是为什么我们可能想在第二个示例中的构造函数的主体中放置一些内容。即使没有任何东西,它已经使用父类的构造函数创建并返回了一个对象。