C++全局和静态变量初始化

转自: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开始之前被初始化;只有函数内的局部静态变量才是在第一次使用才初始化的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。