条款4:确定对象在被使用前已经被初始化
发布日期:2021-05-09 00:20:09 浏览次数:14 分类:博客文章

本文共 993 字,大约阅读时间需要 3 分钟。

需要注意三点:

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.cpp11 FileSystem fs;    //这里是定义12 13 14 ///b.cpp15 class Directory16 {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.cpp16 class Directory17 {18 public:19     Directory(string params)20     {21         int  disks = tfs().numDisks();    22     }23 };

 

上一篇:ON_COMMAND,ON_MESSAGE和ON_NOTIFY的区别
下一篇:模拟鼠标移动程序实现——解决域控制器策略强制电脑锁屏问题(转)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月29日 05时49分13秒