Q1:必须在构造函数的初始化列表中进行初始化的四种情况:
1) 初始化一个引用成员时
2) 初始化一个常量成员
3) 调用基类的构造函数时
4) 调用类成员的构造函数时
• 除了上述四种,程序可以正确编译并执行,不过效率将有可能降低。如下:
class X
{
string _name;
int _cnt;
public:
X()
{
_name = "";
_cnt = 0;
}
};
在这种情况下,效率将远低于在初始化列表中直接调用_name成员的构造函数,编译器扩展后的结果:
class X
{
string _name;
int _cnt;
public:
X()
{
_name.string::string(); //调用string 的默认构造函数
string temp = string(""); //创建临时对象 temp
_name.string::operator=(temp); //调用赋值操作符为_name成员赋值
temp.string::~string(); //销毁临时对象
_cnt = 0;
}
};
Q2:构造函数初始化列表中成员的初始化顺序由类成员的声明顺序决定,与初始化列表中的排列顺序无关
• 初始化列表中的初始化操作在构造函数体内语句执行前结束