Effective C++----条款四

本文讨论了C++中非局部静态对象的问题,强调了在多文件编译时,由于编译顺序不确定性可能导致的未初始化问题。作者建议将静态对象转化为静态成员函数返回,以确保对象在使用前正确初始化,并避免不必要的构造和析构开销。这种方式可以提高程序的稳定性和效率。
摘要由CSDN通过智能技术生成

条款四

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值