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()函数结束后被析构。
这两者在何时被初始化(构造)这个问题上存在细微的差别:
对于local static对象,在其所属的函数被调用之前,该对象并不存在,即只有在第一次调用对应函数时,local static对象才被构造出来。
而对于non-local static对象,在main()函数开始前就已经被构造出来,并在main()函数结束后被析构。
可以通过以下的试验代码来分辨这细微的差别
#include <iostream>
using namespace std;
class InnerClassA
{
public:
InnerClassA(){cout<<"in ctor of InnerClassA"<<endl;}
~InnerClassA(){cout<<"in dtor 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 0;
}输出结果:对应Effective c++ 条款4:确定对象被使用前已被初始化。 中 用local static 对象替代 non-local static对象,也对应于design pattern 中的 singleton模式

本文详细解释了C++中localstatic与non-localstatic对象的区别,包括它们的初始化时机和如何在代码中实现单例模式。通过实验代码展示这两种对象的不同生命周期。
7732

被折叠的 条评论
为什么被折叠?



