确定对象在被使用前被初始化(Make sure that objects are initialized before they’re used)——effective c++学习笔记

 

永远在对象是使用之前初始化它。

不要混淆了成员变量的赋值和初始化的区别:

对于对象的非内置类型(intchar等)成员,他们的初始化动作时发生在构造函数本体之前。在构造函数中,这些成员是被复制,而不是被初始化。初始化发生在这些成员的default构造函数被调用之时。但是对于内置类型成员不能保证也是如此的。

我们可以在构造函数前加入member initialization list(成员初值列表)替换复制动作:

class Number

{

    private:

        Explicit _e;

        Explicit _e2;

 

    public :

        Number(int i)

        :_e2(5),

        _e(i)

        {

            printf("Number 构造函数./n");

        }

        virtual

        ~Number( )

        {

            printf("Number 析构函数./n");

        }

};

如果不加成员初值列表,相当于成员向初始化,然后马上赋值,这样前面的初始化就相当于白费了。

对于内置类型成员,它赋值和初始化的成本相同,最好也通过初始化列表来实现,这样可以保持统一。

注意:必须在初值成员列表中初始化所有的成员。

如果成员过多,且类有多个构造函数,则初值成员列表可能会过程,造成代码重复。 可以适当的将内置成员单独拎出来放在一个统一的函数中实现。总之,真正的初始化比伪初始化通常更可取。

注:成员的构造函数早于类的构造函数,而析构函数晚于类的析构函数。

注:成员初始化顺序总是和成员声明的顺序相同,而和初值成员列表的顺序无关。

 

注意:

1、  为内置对象手动初始化,因为c++不保证初始化他们。

2、  构造函数最好使用成员初值列,而不要在构造函数中使用赋值操作。初值列中成员的顺序,应该和他们在class中声明的顺序一样。

3、  为避免“跨编译单元值初始化次序”问题,请以local static对象代替non-local static对象。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值