一、必须使用初始化列表的四种情况:
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还没有被建构起来