使用C++语言进行程序开发时,变量的初始化贯穿于始终:数组、指针、容器、对象等等都需要初始化,没有初始化而被使用或初始化出现问题,整个程序将出现很多意想不到的错误。
1 初始化
初始化变量的形式有两种:赋值初始化、直接初始化。
例如:
int ivar(1024); //直接初始化
int ivar = 1024; //赋值初始化
这里应该注意一点区别:初始化不是赋值。
一般情况下,直接初始化更灵活,效率更高。
C++为了满足开发需要,对某些类型提供了多个初始化方式,其中对于类这种类型来说,多种初始化源于其本身的各种构造函数的不同。当然对于C++内置类型来说,赋值初始化与直接初始化几乎没有差别。
由于构造函数是一种特殊的函数,它接受不同的参数,因此,根据其不同的形式,初始化的形式也有多种。
例如:string类
string svar("c++ study"); //直接初始化
string svar = "c++ study"; //赋值初始化
string svar(10,'c'); //svar = "cccccccccc"
2 自动初始化规则
2.1 内置类型变量的初始化
对于内置类型变量的初始化,有一条重要的规则:
在函数体外部定义的变量都自动初始化为0,在函数体内部系统不自动为其初始化。
对于最佳的实践方案是:每个内置类型的对象都要初始化。
例如:
int ivar; //在函数体外,ivar被默认初始化为0。
int getvar1()
{
return ivar;
}
int getvar2()
{
int ivar2; //警告:在函数体内部,ivar2不能被自动初始化。
ivar += ivar2;
return ivar; //ivar将返回莫名其妙的值。
}
int
main(int argc, char *argv[])
{
return 0;
}
2.2 类类型变量的初始化
如果定义某个类时,如果没有提供初始化方式,则会调用默认构造函数对其进行初始化。
由于其本身的性质原因,当类对象被定义时,不管在函数体内部还是外部,默认构造函数都将被调用。
大多数类都提供了默认构造函数。如果某些类没有提供默认构造函数,那么,每个定义都必须提供显示的初始化形式。
例如:
string svar; //在函数体外,svar被默认初始化为""。
void getvar()
{
string svar2; //在函数体内部,svar2同样被默认初始化为""
svar = svar2;
}
int
main(int argc, char *argv[])
{
return 0;
}
数组、指针、容器、对象以及const和static的初始化要到各自的章节才具体介绍,不过,大体的初始化规则还是一致的。