在C++中,如果在一个文件中定义了int a = 5;要在另一个文件中定义int b = a;的话,前面必须对a进行声明:extern int a;否则编译不通过. 即使是这样,int b = a;这句话也是分两步进行的:在编译阶段,编译器把b当作是未初始化数据而将它初始化为0;在执行阶段,在main被执行前有一个全局对象的构造过程,int b = a;被当作是int型对象b的拷贝初始化构造来执行。
其实,准确地说,在C++中全局对象、变量的初始化是独立的,如果不是象int a = 5;这样的已初始化数据,那么就是象b这样的未初始化数据。
不能保证,事实上,除了在同一个文件定义的全局对象的初始化
是按照定义次序来进行的之外,其他全局或静态变量之间的初始
化次序没有任何保障。解决这种问题的方法是不直接使用全局变
量,而改用一个包装函数来访问,例如
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}
关于C++中局部静态对象/变量的初始化想说两句:
1、这种变量的存储是在编译时就分配好了的,对于编译阶段就能确定初值的对象,比如static int x=2,编译器会把它们放到.data区中;对于没有给初值或编译阶段不能确定初值的对象,比如static int x,或者是需要调用构造函数的对象,比如static A a = 8, 编译器统一把它们当作是未初始化数据来处理,将其所占内存区统统置为0并放在.bss区中;
2、"在函数调用过程中初次碰到(局部静态)对象的定义时",准确地说是该对象的构造函数被调用,如果须要的话。
同一楼上的观点。
另外对 GuanXP兄弟的官邸有些疑问?
不能保证,事实上,除了在同一个文件定义的全局对象的初始化
是按照定义次序来进行的之外,其他全局或静态变量之间的初始
化次序没有任何保障。解决这种问题的方法是不直接使用全局变
量,而改用一个包装函数来访问,例如
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}