首页 > 代码库 > c++ 变量定义 的初始化规则
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个元素都被初始化为0int 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 //化为018 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。