下面为大家简单地讲解一下C++中变量初始化的若干规则,限于本人学识有限,定有不详或不正确之描述,还望午饭们发扬找不到错误不罢休的精神,多多指点纠正,这样我也好及时修改自己的文章,为午饭们提供更好更有用的基础学习贴。
---------------------------------------------------------------------------------------------------
当定义没有初始化式的变量(如int i;)时,系统有可能会为我们进行隐式的初始化。至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于该变量的类型以及我们在何处定义的该变量。
1】内置类型变量的初始化
内置变量是否自动初始化,取决于该变量定义的位置。
①在全局范围内的内置类型变量均被编译器自动初始化为0值
复制内容到剪贴板
代码:
#include<iostream>
using namespace std;
//全局范围内的部分内部变量
int gi; //被自动初始化为0
float gf; //被自动初始化为0.0
double gd; //被自动初始化为0.0
char gc; //被自动初始化为'\0'
int main(int argc, char **argv)
{
return EXIT_SUCCESS;
}
②在函数体内定义的内置类型变量值随机(有的编译器可能会为你初始化为0,但
千万别依赖于这种可能行为,因为它会给你的程序带来未定义的行为)
复制内容到剪贴板
代码:
#include<iostream>
using namespace std;
int main(int argc, char **argv)
{
//局部范围内的部分内部变量
int i; //不被自动初始化,值随机(有可能是0,依编译器实现而定)
float f; //不被自动初始化,值随机(有可能是0,依编译器实现而定)
double d; //不被自动初始化,值随机(有可能是0,依编译器实现而定)
char c; //不被自动初始化,值随机(有可能是0,依编译器实现而定)
return EXIT_SUCCESS;
}
③内置类型数组的初始化规则同上
复制内容到剪贴板
代码:
#include<iostream>
using namespace std;
//全局范围内的内置类型数组
int gIntArr[5]; //5个元素都被初始化为0
int main(int argc, char **argv)
{
//局部范围内的内置类型数组
int intArr[5]; //未被初始化
return EXIT_SUCCESS;
}
2】类类型变量的初始化
类类型变量是通过构造函数进行初始化的,
不论类类型变量在哪里(全局或者局部)定义,该类类型变量的构造函数(默认构造函数或者指定的带参构造函数)总会被调用。
想要知道构造函数在各种情况下如何初始化类中数据成员的,我们必须首先了解构造函数的初始化发生在何时。
复制内容到剪贴板
代码:
//构造函数中的初始化发生在构造函数的初始化列表中
//而非构造函数体中
class Foo
{
public:
Foo(int i):_integer(i) //初始化列表中进行的是初始化
{
//这里是构造函数的函数体
//在这里进行的是赋值操作,而不是初始化
_integer = i;
}
private:
int _integer;
};
现在我们知道,构造函数的初始化是发生在初始化列表中的,那么,对于
初始化列表中没有显示进行初始化的内置类型变量来说,其初始化规则就与上述内置类型变量的规则相同了。
下面我们就一起来探索这个问题:
复制内容到剪贴板
代码:
#include<iostream>
using namespace std;
class Foo
{
public:
Foo(void):_explicitInit(1024){}
private:
int _explicitInit; //在构造函数初始化列表中
//显式初始化的内置类型变量
int _implicitInit; //没有在构造函数中显式初始
//化的内置类型变量
};
Foo gF; //全局范围内的类类型变量,_explicitInit被
//显式初始化为1024,_implicitInit被自动初始
//化为0
int main(int argc, char **argv)
{
Foo f; //局部范围的类类型变量,_explicitInit被
//显式初始化为1024,_implicitInit不会被
//自动初始化,值随机
return EXIT_SUCCESS;
}
本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/733279,如需转载请自行联系原作者