当我们定义一个没有初始化式的变量时,系统有时候会帮我们初始化变量,有时候又不会帮我们初始化变量。这主要取决于三点:(1)变量的类型;(2)变量的位置;(3)特殊的关键字。
1、 内置类型变量的初始化
内置类型是指C++语言本身定义的基本数据类型,如int、double、bool、char等,这些内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量(即全局变量)都初始化为0,在函数体里定义的变量(即局部变量)不自动进行初始化。实际上,未初始化的变量事实上都有一个值,它会随机把该变量放到内存中的某个位置,编译器会把这个位置中的值当成一个合法的值去做相关的运算,而这种错误是我们很难发现的,往往会导致程序错误执行。
上面说的应该不难理解,有趣的是我在VS2010上验证上面的说法时,发现全局变量确实会初始化为0,但是局部变量却不是一个随机值,而是一个固定值-858993460(0xcccccccc)。后来上网查了一下后发现,在VC Debug版本里,栈中分配的值都会先用0xCCCCCCCC来处理一下,所以大家在Debug模式下调试程序发现在引用0xCCCCCCCC这样的值,就说明在试图使用一个没有初始化的值。DEBUG版本为了能让程序员更早的发现错误,把堆栈上的数据对初始化成了0xCCCCCCCC,也就是说局部变量如果不初始化,那么DEBUG版本中就会是0xCCCCCCCC,从而容易发现未初始化的错误。如果想详细了解VC中的0xCCCCCCCC可以参考下面的网址
http://qiusuoge.com/8291.html
2、 类类型变量的初始化
每个类都定义了该类型的对象可以怎样初始化。类可以通过定义一个或多个构造函数来控制类对象的初始化。如果定义某个类的变量时没有提供初始化式,这个类也可以定义初始化时的操作。它是通过一个特殊的构造函数即默认构造函数来实现的。这个构造函数之所以被称作默认构造函数,是因为它是“默认”运行的。如果没有提供初始化式,那么就会使用默认构造函数。不管变量在哪里定义(无论是全局变量还是局部变量),默认构造函数都会被使用。
大多数类都提供了默认构造函数。如果类具有默认构造函数,那么就可以在定义该类的变量时不用显示地初始化变量。例如,string类定义了默认构造函数来初始化string变量为空字符串,即没有字符的字符串:
string empty;//empty是一个空串:empty=“”
有些类类型没有默认构造函数。对于这些类型来说,每个定义都必须提供显示的初始化式。没有初始值是根本不能定义这种数据类型的变量的。
3、 特殊的关键字
对于使用static关键字修饰的内置类型变量,不管变量在哪里定义(无论是全局变量还是局部变量),都会像全局变量一样初始化为0。