初始化列表

一、必须使用初始化列表的四种情况:

1、reference member

2、const member

3、调用一个base class的constructor,而它拥有一组参数

4、调用一个member class的constructor,它拥有一组参数


class World{
    string name;
    int cnt;
public:
    World(){
         _name=0;
         _cnt=0;
    }
};

以上代码,构造函数中会产生一个临时对象_temp,然后将临时对象拷贝给_name,最后析构临时对象。


二、初始化顺序和声明顺序要一致

Class X{
    int i;
    int j;
public:
    X(in val);
};

(a)以上代码注意将i放在j前面初始化

(b)初始化列表会安插在explicit user assignment 之后,故下面代码正确:

X::X(int val):j(val){
    i=j;
}

三、不要用devrived class中的成员作为base class构造函数的的参数

(a)正确的情况:用本类的函数用于参数初始化列表

X::X(int val)
{
   //正确,因为和此object相关的this指针都已被建构妥当
    i=this->xfoo(val);
    j=val;
}
(a)错误的情况:用derived class的函数用于base class 参数初始化列表

Class FooBar:public X{
    inf _fval;
public:
     int fval(){return val;}//derived class的函数
     FooBar(int val)_fval(val),X(fval()){}
};
X(fval())等价于
X::X(this,this->fval());
而此时this还没有被建构起来


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值