大部分程序员写构造函数时是这样的:
class ClassA
{
ClassA();
......
};
ClassA::ClassA()
{
A=1;
B=2;
......
}
这一类构造函数包括了初始化和赋值两个步骤,在执行构造函数函数体内语句前,已经隐式调用了默认构造函数对变量进行初始化,函数体内语句其实是进行了一次赋值。
更规范的是使用初始化列表进行初始化,即显式初始化。
ClassA::ClassA():A(1),B(2)
{
}
使用默认构造函数时,初始化成员的规则与初始化变量规则相同,即具有类类型的成员使用默认各自的默认构造函数来初始化,内置和复合类型的全局变量初始化为0,内置和复合类型的局部作用域的变量则不初始化。
故而使用显示初始化是有好处的。第一是效率问题,因为要额外赋值一次,在函数体内赋值效率相对较低,当然如果你不在乎这一点点效率,我们还有第二条;第二条如果没有在函数体内给类成员提供初始化式,编译器会使用成员类型的默认构造函数;如果那个类没有默认构造函数,则初始化失败。另外const或引用类型的成员,无法赋值,只能在初始化列表中初始化。譬如:
class ClassA
{
private:
int i;
const int j;
int &k;
public:
ClassA(int B);
......
};
ClassA::ClassA(int B)
{
i=B; //ok
j=B; //error,不能给const对象赋值
k=i; //error,k没有初始化绑定一个对象
......
}
正确初始化方式为
ClassA::ClassA(int B):i(B),j(B),k(i)
{
}
以上参考自《c++primer》