构造函数之显式初始化与赋值

  大部分程序员写构造函数时是这样的:

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》

你可能感兴趣的:(c++,c++,显式初始化,构造函数,构造函数初始化列表)