您的位置:首页 > 编程语言 > C语言/C++

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

2016-05-17 10:51 453 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: