条款四
对于no -local static 对象尽量将每个no-local static对象,搬到自己的专属函数里面,这些函数反对一个reference 指向他们所含的对象(这些static对象),然后用户调用这些对象
/*no local static
expect local
local static:
in class
int function
int namespace
int file
多文件编译时,如果我们全部用的时no local static
现在我们需要通过 file1中的static int size去给我们的file2中的一个参数赋值
因为c++中,没有明确的定义 file1和file2的编译顺序,
因此,size在给file2赋值的时候,极有可能未被赋值,会造成不可预知的后果
*/
比如:
//Month.h
//我们假设在month.h已经定义了一些月份的对象
class Month{
public:
extern Montj(int m):month(m){}
private:
int month;
};
//这些就是no-local static对象
Month Jan(1);
Month Feb(2);
....
//最初的设想可能是,当我们引入头文件之后,我们可以直接调用Jan,Feb对象作为已经实现的对象
//但是正如上面所说的,C++并没有准确的定义Month.h和其他头文件的编译顺序,因此在我们在其他文件中调用Jan的时候,很可能它还没有被赋值,造成无法预知的结果
根据条款四给出的建议,我们做出以下修改:
class Month{
public:
static Month Jan() {return Month(1);}
static Month Feb() {return Month(2);}
extern Month(int m):month(m){}
private:
int month;
};
而我们将no-local static对象直接转换为对象中的一个static函数的好处是有两个:
第一:对于local static对象来说,当我们第一次通过Month对象调用函数的时候,相应的对象就会初始化.。例如,当我们在
//----Main.cpp----//
#include"Month.h"
#include<iostream>
int main(void){
Month jan=Month.Jan();
}
第一次调用Month.Jan()的时候,就会先于赋值初始化Jan
第二个好处:对于直接声明为class Monnth中的local static对象相比,这样做的好处是,如果我们从未调用过某个月份的函数,那么就永远不用付出对于这个月份对象的构造和析构的代价