《Effective C++》条款04(确定对象被使用前已初始化)

在c++中对象在使用前应该初始化,对于初始化有两种一种是利用初始化列表初始化,另一种则是采用赋值的方式进行初始化,但是因为用列表初始化的效率会比用赋值符号初始化高效,所以,C++语言中建议用列表初始化完成对象的初始化。当用构造函数完成数据初始化时,应该确保每一个成员变量被初始化。
如下的赋值方式:
在这里插入图片描述

以上的方式不值得推崇,而使用成员列表初始化具有更高的效率,因为对于大多数的类型成员来说,先调用默认构造函数在调用赋值运算符的方式比单一的copy要低效。因此我们可以这样构造。
在这里插入图片描述

对于没有用参数的构造函数,我们可以调用相应成员的类型的默认构造函数来构造该成员。
在这里插入图片描述事实上我们不需要记住那些成员需要初始化那些不需要,我们只需要将每一个成员都进行初始化就可以了。

对于构造函数初始化,编译器有相对固定的次序,先初始化基类的成员,而对于派生类的数据初始化,总是按照声明顺序初始化,即使在初始化列表中没有按照声明顺序写,编译器初始化的顺序也是按照声明顺序进行的。如果我们使用成员变量有要求则应该注意变量的声明顺序。

non-local static 对象的使用
local-static对象是指函数内部的数据对象,其他的static对象被称为none-local static 对象。包括 全局变量、命名空间内、类内和文件内的static对象。

如果某个编译单元内的某个none-local static对象的初始化动作使用了另一个编译单元的none-local static 对象,那么它所用到的数据对象可能是未定义的。
在这里插入图片描述在这里插入图片描述除非tfs在tempDir之前被初始化,否则tempDir的构造函数将会用到未初始化的tfs。

消除这种情况的方案:将每个non-loca static对象搬到自己的专属函数内,并将该对象声明为static,并返回指向该对象的引用。 这样将non-local static对象变成来local-static对象,而在C++语言中,函数内的local static对象将会在该函数被调用期间,该变量被使用之前,将该对象初始化。

在这里插入图片描述

对于这样的函数实现非常简单:第一行定义并初始化一个local static对象,第二行返回它。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值