Effective_C++:13、initialization list中的members初始化次序应该和其在class内的声明次序相同

13、initialization list中的members初始化次序应该和其在class内的声明次序相同

1、初始化列表的成员初始化次序

        初始化列表的成员初始化次序是按照他们在class内的声明次序,与成员初始化列表中出现的次序无关。记住,这是一个设定,编译器在编译时会按照class内的声明次序对成员进行初始化,在成员初始化列表的调用对应的构造函数,不在成员初始化列表的调用默认构造函数。

2、为啥类成员以class内的声明次序初始化

        首先,有一点要清楚,数据成员的析构函数总是以“和其构造函数相反的次序”调用,即若调用类的构造函数时,先(对比类中的其他数据成员)调用了某个数据成员的构造函数,则在调用类的析构函数时,会最后(对比类中的其他数据成员)调用该数据成员的析构函数。
class Wacko {
public:
    Wacko(const char *s) : s1(s), s2(0) {}
    Wacko(const Wacko& rhs) : s2(rhs.s1), s1(0) {}
private:
    string s1, s2;
};

Wacko w1 = "Hello world!";
Wacko w2 = w1;

        若类的成员以成员初始化列表中的次序进行初始化,则对于相同类型使用不同的构造函数创建的多个对象,其数据成员的初始化次序可能不同。根据构造函数和析构函数的调用次序相反,编译器需要跟踪每个对象的成员初始化次序,以便在调用析构函数时能正确的调用数据成员的析构函数。这样带来了极大的成本与负担,因此,对于任何型别的所有对象,他们的数据成员的构造次序都相同,析构次序也都相同。

3、以数据成员在class内的声明次序将其列入成员初始化列表中

        类的static成员要在类外进行初始化,只初始化一次,不能出现在成员初始化列表中,故上述初始化针对的是非static成员。同时,在继承中,基类数据成员永远在派生类数据成员之前初始化,应在成员初始化列表起始处列出基类的初值设定式。若使用多重继承,基类以继承的次序进行初始化,与初始化列表的次序无关。
        总之,类的成员以其在类中的声明次序进行初始化。故在写成员初始化列表时,尽量按照类中的声明次序将成员列出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值