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