Effective C++----条款四

葛炜
2023-12-01

条款四

对于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对象相比,这样做的好处是,如果我们从未调用过某个月份的函数,那么就永远不用付出对于这个月份对象的构造和析构的代价

 类似资料: