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

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

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》

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值