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


你可能感兴趣的:(C++,function,File,存储,Class,iostream)