c++ 变量定义 的初始化规则


      当定义
没有初始化式的变量(如int i;)时,系统有可能会为我们进行隐式的初始化。至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于该变量的类型以及我们在何处定义的该变量
      
      1】内置类型变量的初始化
           内置变量是否自动初始化,取决于该变量定义的位置。
           ①在全局范围内的内置类型变量均被编译器自动初始化为0值

 

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 //全局范围内的部分内部变量
 6 int gi;  //被自动初始化为0
 7 float gf;  //被自动初始化为0.0
 8 double gd;  //被自动初始化为0.0
 9 char gc;  //被自动初始化为‘\0‘
10 
11 int main(int argc, char **argv)
12 {
13   return EXIT_SUCCESS;
14 }

 

②在函数体内定义的内置类型变量值随机(有的编译器可能会为你初始化为0,但千万别依赖于这种可能行为,因为它会给你的程序带来未定义的行为)

 

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int main(int argc, char **argv)
 6 {
 7   //局部范围内的部分内部变量
 8   int i;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
 9   float f;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
10   double d;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
11   char c;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
12 
13   return EXIT_SUCCESS;
14 }

 

③内置类型数组的初始化规则同上

#include<iostream>

using namespace std;

//全局范围内的内置类型数组
int gIntArr[5];  //5个元素都被初始化为0

int main(int argc, char **argv)
{
  //局部范围内的内置类型数组
  int intArr[5];  //未被初始化
  
  return EXIT_SUCCESS;
}

2】类类型变量的初始化
           类类型变量是通过构造函数进行初始化的,不论类类型变量在哪里(全局或者局部)定义,该类类型变量的构造函数(默认构造函数或者指定的带参构造函数)总会被调用
           想要知道构造函数在各种情况下如何初始化类中数据成员的,我们必须首先了解构造函数的初始化发生在何时。

 1 //构造函数中的初始化发生在构造函数的初始化列表中
 2 //而非构造函数体中
 3 class Foo
 4 {
 5   public:
 6     Foo(int i):_integer(i)  //初始化列表中进行的是初始化
 7     {
 8       //这里是构造函数的函数体
 9       //在这里进行的是赋值操作,而不是初始化
10       _integer = i;
11     }
12   private:
13     int _integer;
14 };

现在我们知道,构造函数的初始化是发生在初始化列表中的,那么,对于初始化列表中没有显示进行初始化的内置类型变量来说,其初始化规则就与上述内置类型变量的规则相同了。
           下面我们就一起来探索这个问题:

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Foo
 5 {
 6   public:
 7     Foo(void):_explicitInit(1024){}
 8   private:
 9     int _explicitInit;  //在构造函数初始化列表中
10                         //显式初始化的内置类型变量
11     int _implicitInit;  //没有在构造函数中显式初始
12                         //化的内置类型变量
13 };
14 
15 Foo gF;  //全局范围内的类类型变量,_explicitInit被
16          //显式初始化为1024,_implicitInit被自动初始
17          //化为0
18 
19 int main(int argc, char **argv)
20 {
21   Foo f; //局部范围的类类型变量,_explicitInit被
22          //显式初始化为1024,_implicitInit不会被
23          //自动初始化,值随机
24 
25   return EXIT_SUCCESS;
26 }

 

本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/733279

 

 

 

c++ 变量定义 的初始化规则,布布扣,bubuko.com

c++ 变量定义 的初始化规则

上一篇:Command 'java' not found during running appium


下一篇:JAVA数组的定义及用法