C++ local static对象和non-local static对象在初始化时机上的差异

C++中的static对象是指存储区不属于stack和heap、”寿命”从被构造出来直至程序结束为止的对象。这些对象包括全局对象,定义于namespace作用域的对象,在class、function以及file作用域中被声明为static的对象。其中,函数内的static对象称为local static 对象,而其它static对象称为non-local static对象。

这两者在何时被初始化(构造)这个问题上存在细微的差别:

对于local static对象,在其所属的函数被调用之前,该对象并不存在,即只有在第一次调用对应函数时,local static对象才被构造出来。

而对于non-local static对象,在main()函数开始前就已经被构造出来,并在main()函数结束后被析构。

可以通过以下的试验代码来分辨这细微的差别
#include <iostream>
using namespace std;

class InnerClassA 
{
public:
    InnerClassA(){cout<<"in ctor of InnerClassA"<<endl;}

};


class InnerClassB 
{
public:
    InnerClassB(){cout<<"in ctor of InnerClassB"<<endl;}
    ~InnerClassB(){cout<<"in dtor of InnerClassB"<<endl;}
};


class WrapperClassA
{
 public:
    WrapperClassA(){}

    InnerClassA & singleton()
    {
    static InnerClassA innerObjA;   //local static object
    return innerObjA;
    }
};

// class with non-local static object
class WrapperClassB
{
public:
    WrapperClassB(){}
//static data member declaration
    static InnerClassB innerObjB;
};

//static member definition
InnerClassB WrapperClassB::innerObjB;

int main( int argc,char * argv[])
{
    cout<<"main() started."<<endl;
    WrapperClassA objA;
//  objA.singleton();   //只有去掉注释执行该语句时,innerObjA才被构造出来
    cout<<"main() terminated."<<endl;
    return 1;

}

程序执行结果

in ctor of InnerClassB
main() started.
main() terminated.
in dtor of InnerClassB
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值