转自:http://www.cnblogs.com/zhenjing/archive/2010/10/15/1852116.html
对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内存空间,因此程序结束后全局内存空间被一起回收,不存在变量依赖问题,没有任何代码会再被执行!
C++引入了对象,这给全局变量的管理带领新的麻烦。C++的对象必须有构造函数生成,并最终执行析构操作。由于构造和析构并非分配内存那么简单,可以相当复杂,因此何时执行全局或静态对象(C++)的构造和析构呢?
#include<iostream> #include<string> using namespace std; class Var { public : Var(const string& str) { name = str; cout<<"初始化:"<<name<<endl; } ~Var(){} void Print() { cout<<"Print:"<<name<<endl; } private: string name; }; Var VAR1("global var1"); static Var Var2("static var2"); void Func() { static Var var3("Func static var3"); var3.Print(); } int main(int argc, char** argv) { cout<<"Main start..."<<endl; VAR1.Print(); Var2.Print(); Func(); cout<<"Main end..."<<endl; system("pause"); ; } //输出 //初始化:global var1 //初始化:static var2 //Main start... //Print:global var1 //Print:static var2 //初始化:Func static var3 //Print:Func static var3 //Main end...
采用VS2012 编译的结果是:全局变量和文件域的静态变量都将在main开始之前被初始化;只有函数内的局部静态变量才是在第一次使用才初始化的。