Effective.C 读书笔记02

保持习惯,继续写博客。

条款04:确定对象被使用前已被初始化

C++未初始化的值会导致不明确的行为。

C++初始化采用成员初值列的做法比较高效。

 class ABEntry 
{
   private:
    std::string theName;
    std::string theAddress;
    std::list<PhoneNumber> thePhones;
    int numTimesConsulted;
}

ABEntry::ABEntry()
:theName(),
 theAddress(),
 thePhones(),
 numTimesConsulted(0)
{}
成员初始化次序:base classes 更早于其derived classes 被初始化,而class 的成员变量总是以其声明次序被初始化。所以改变成员初值列的顺序也不会改变其初始化的次序。

跨编译单元之初始化次序的问题:如果有至少2个源码文件,可以采用local static 来代替non-local static 对象

不可以的代码:

 class FileSystem { 		 //来自你的程序库
 public :
    ...
    std::size_t numDisks() const; //众多的成员函数之一
    ...
};
extern FileSystem tfs; 		 //预备给客户使用的对象,tfs 代表“the file system”

class Directory{            //由程序库客户建立
public :
    Directory(params);
    ...
};
Directory::Directory(params)
{
    ...
    std::size_t disks = tfs.numDisks(); //使用tfs 对象
    ...
}
Directory temDir(params); //为临时文件而做出的目录
这样可能在temDir 初始化的时候tfs还未初始化。

local static做法:

 class FileSystem{...}; 		 //同前
FileSystem& tfs()                       //这个函数用来替换tfs对象,它在FileSystem class 中可能是个staitc
{
    static FileSystem fs;             //定义并初始化一个local static 对象
    return fs;                        //返回一个reference 指向上述对象
}
class Directory{...};                       //同前
Directory::Directory(params)                 //同前,但原本的reference to tfs 现在改为tfs()
{
    ...
    std::size_t disks = tfs.numDisk();
    ...
}
Directory &tempDir()                    //这个函数用来替换tempDir对象
{                                       //它在Directory class 中可能是个static 
    static Directory td;                 //定义并初始化local static 对象
    return td;                          //返回一个reference 指向上述对象
}
请记住:

为内置型对象进行手工初始化,因为C++不保证初始化它们。

构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排序次序应该和它们在class 中的声明次序相同。

为免除“跨编译单元之初始化次序”问题,请以local static 对象替换 non-local static 对象。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值