这里先解释一下名词,static是静态的意思,表示这个变量不由栈分配,而存储在特有的全局变量/静态变量区域中,具有长寿命的特点(从被构造出来,直到程序结束时,才会由系统释放资源);而non-local则是说这个对象是全局的,而不是函数内的静态变量,是说它的作用范围广。本博客中
http://www.cnblogs.com/jerry19880126/archive/2012/12/22/2829394.html
介绍了有关函数作域和生存周期的区别。
这里相关名词感觉这个解释比较合理:
编译单元指的是可以编译为.o文件的代码。
static对象就是全局对象,在namespace作用域的对象;类内,函数内,文件作用域内的static对象。
non-local对象就是不在函数内定义的对象。
比如在文件1中定义了
int a = 1;
而在文件2中又会去使用:
extern int a;
int b = a *3;
可以看到文件1应在文件2之后执行,这样a才能获得初值,否则b得到的将是垃圾值,但事实上C++对于不同文件执行的相对次序并无明确定义,这样b究竟得到的是垃圾值还是3就不能确定。
解决这个问题是方法是不要使变量有全局的作用域,可以在文件1中定义:
1 int& GetA()
2 {
3 static int a = 1;
4 return a;
5 }
而在文件2中调用
int b = GetA();
这样就一定保证a的初始化在先了。
总结一下:
(1) 为内置型对象进行手工初始化,因为C++不保证初始化它们;
(2) 构造函数最好使用成员初始化列表(实际初始化顺序不与列表的排列顺序有关,只取决于类中的声明顺序),而不要在构造函数体内使用赋值操作;
(3) 未避免“跨编译单元的初始化次序”问题,请用local static代替non-local static对象。
转发:https://www.cnblogs.com/jerry19880126/archive/2013/03/09/2951186.html