需要注意三点:
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 };