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
相关文章推荐
- C语言练习题:自由落体的小球简单实例
- 新增的C语言完整源代码
- C语言练习题:求1到10的阶乘之和简单实例
- OpenCV中C++函数imread读取图片的缩放问题
- C++程序设计必知:常引用、常对象和对象的常成员
- C / C++ 输入输出缓存处理
- C语言指针变量可以当做数组运用
- 2016年,C语言该怎样写
- gsoap笔记 C++
- 330. Patching Array (C++实现)
- 深入理解C++中public、protected及private用法
- OC语言笔记(十二):OC字符串、数组、字典常用方法大全
- OC语言笔记(十一):OC沙盒查找步骤
- C#调用C++DLL的小总结5---和C++的DLL的联合调试
- 第8周 C语言及程序设计提高例程-30 字符和字符串处理函数
- 成为C++高手之for循环
- 预定义宏 ANSI C
- C++虚基类的实现机制:笔记
- 原型模式-c++实现
- Effective C++: volatile