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

时间:2023-03-08 22:56:26
C++全局和静态变量初始化

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