转自:http://www.cnblogs.com/zhenjing/archive/2010/10/15/1852116.html
对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内存空间,因此程序结束后全局内存空间被一起回收,不存在变量依赖问题,没有任何代码会再被执行!
C++引入了对象,这给全局变量的管理带领新的麻烦。C++的对象必须有构造函数生成,并最终执行析构操作。由于构造和析构并非分配内存那么简单,可以相当复杂,因此何时执行全局或静态对象(C++)的构造和析构呢?
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 class Var { 6 public : 7 Var(const string& str) 8 { 9 name = str; 10 cout<<"初始化:"<<name<<endl; 11 } 12 13 ~Var(){} 14 15 void Print() 16 { 17 cout<<"Print:"<<name<<endl; 18 } 19 private: 20 string name; 21 }; 22 23 Var VAR1("global var1"); 24 static Var Var2("static var2"); 25 26 void Func() 27 { 28 static Var var3("Func static var3"); 29 var3.Print(); 30 } 31 32 int main(int argc, char** argv) 33 { 34 cout<<"Main start..."<<endl; 35 VAR1.Print(); 36 Var2.Print(); 37 Func(); 38 39 cout<<"Main end..."<<endl; 40 system("pause"); 41 return 0; 42 } 43 44 //输出 45 //初始化:global var1 46 //初始化:static var2 47 //Main start... 48 //Print:global var1 49 //Print:static var2 50 //初始化:Func static var3 51 //Print:Func static var3 52 //Main end...
采用VS2012 编译的结果是:全局变量和文件域的静态变量都将在main开始之前被初始化;只有函数内的局部静态变量才是在第一次使用才初始化的。
时间: 2024-10-30 19:49:22