条款4:确定对象在被使用前已经被初始化

需要注意三点:

1.手工初始化内置型的非成员对象

2.使用初始化成员列表对付对象的所有成员

3.对"初始化顺序不确实"的问题要注意自己的设计.

这里重点介绍下第三种的情况:

下面的tfs会在外部文件b.cpp中使用,但是当前这种写法不能够保证tfs在b.cpp中使用时已经被初始化了,这样就会造成问题.

 1 //a.h
 2 class FileSystem
 3 {
 4 public:
 5     int numDisk() const;
 6 };
 7 
 8 extern FileSystem fs;    //只是声明
 9 
10 //a.cpp
11 FileSystem fs;    //这里是定义
12 
13 
14 ///b.cpp
15 class Directory
16 {
17 public:
18     Directory(string params)
19     {
20         int disks = fs.numDisks();    //因为a.cpp和b.cpp在编译时并不能保证先后顺序,有可能出现tfs还没有被初始化,就被使用的情况
21     }
22 };

把tfs声明为一个函数,返回对象的引用,这样b.cpp中去调用时,就能够保证fs一定是初始化了的.不过这里我有个疑问,作者为什么要用静态变量的引用呢?不可以是局部变量吗?或者不使用引用吗?

 1 //a.h
 2 class FileSystem    //库中定义的类
 3 {
 4 public:
 5     int numDisks() const;
 6 };
 7 
 8 //a.cpp
 9 FileSystem &tfs()//这样写,表示tfs()是一个全局函数,而非成员函数.
10 {
11     static FileSystem fs;    //C++保证函数中的local static对象会在"该函数被调用期间""首次遇上该对象的定义式"时被初始化.
12     return fs;
13 }
14 
15 //b.cpp
16 class Directory
17 {
18 public:
19     Directory(string params)
20     {
21         int  disks = tfs().numDisks();    
22     }
23 };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingLife99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值