class A{
private:
int data;
string name;
public:
A(int i, string s){ data = i; name = s;}//这只是赋值,并不是初始化
A(int i, string s) : data(i), name(s){}//这是初始化
};
? ? ? ? 在构造函数中为每个成员变量赋值的方式,并不是对象的初始化过程,成员变量的初始化在比调用构造函数更早之前进行。而初始值列表的方式才是对对象的初始化。
? ? ? ? 如果,A中的成员变量有其他类的对象,那么在第一种方式中,会调用其默认构造函数后,再对其进行赋值。而初始值列表的方式,直接由A的实参拿来调用其成员变量对象的复制构造函数。这会提高效率,但是如果成员变量都是内置类型,效率不会提高太多。
? ? ? ? 成员变量的初始化顺序与初始值列表中的顺序无关,与声明中的顺序有关。永远按声明次序进行初始化。