类成员的初始化顺序

编程时尽量将成员的初始化放到初始化列表中,而不是构造函数体中,为什么要采取这样的策略呢,一方面,一些const只能被初始化而不能被赋值,另一方面,在初始化列表中初始化成员比在构造函数体中通过赋值初始化成员效率要高。因为,对象的初始化,首先进行的数据成员的初始化,然后才会执行构造函数体内的动作,对于有基类的对象来说,基类成员的初始化和构造函数体发生在派生类成员初始化和构造函数体之前。因此,如果在初始化列表中对类成员进行初始化将避免两次(一次是默认的构造函数,另一次是赋值)调用类成员的成员函数调用,进而提高了效率。

但是,当出现有大量的固定类型的数据成员需要初始化是,可以不使用初始化列表。此时,可以定义一个专门的初始化函数来初始化这些成员,这个函数有构造函数调用即可。

 

注意:静态成员函数永远不会在构造函数体内被初始化。

 

当然,类成员的初始化顺序对程序有着很重要的影响,初始化列表中成员的顺序必须和他们的声明顺序保持一致,否则将会产生一些致命的错误。你可能会提出这么一个问题,为什么不按成员声明的顺序初始化类成员会产生如此大的错误呢?原因在于,对一个对象的所有成员来说,他们在析构函数被调用的顺序总是和在构造函数里被创建的顺序相反,那么,如果允许初始化列表中成员的顺序和他们的声明顺序不一致,此时,编译器将为每个对象保持一份其成员的初始化顺序,以保证能够在析构函数中被正确的调用,这极大的增加了开销。因此,为了避免这种开销,同一类型的所有对象在创建(构造)和销毁(析构)过程中,成员的处理顺序都是一样的,所以,编程时一定要保证始化列表中成员的顺序必须和他们的声明顺序保持一致。当然,如果有基类,那么基类的初始化应该放在所有成员的前面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值