前几天给系统写一个新功能,被初始化问题搞毛了:一个结构体里包含枚举类型的变量,结果由于没有初始化,搞了一堆随机数……。这个结构体是作为输入参数放在查询函数里的,结果自然查不到。最悲剧的是,在我的Windows平台可以成功查到,Linux平台有一定几率能查到……
如果一个变量没有进行初始化,那么使用它的行为是未定义的行为,这种行为有时正确有时错误,这就是我写的程序结果不确定的原因了。所以,一定不能依赖未定义的行为。
吸取教训,以后要记得尽量初始化,特别是对于内置类型与枚举类型!但是,很多类型的变量在定义时是有默认值的。所以为了以后方便,还是整理一下。
首先列出当变量自动初始化时,每个类型对应的默认值:
变量(对象)类型 |
默认值 |
布尔和所有整型 |
0 |
所有小数 |
0.0 |
char |
‘’ |
string |
“” |
枚举类型 |
第一个枚举成员 |
其他类类型或结构体 |
默认构造函数 |
另外,指针和引用类型的变量是不会自动初始化的,因为它没有一个默认值!当定义一个指针对象时,如int *pi; 此时它并未初始化,使用它很危险。应该在定义时直接初始化为它指向的对象。如果必须分开定义该指针和对象,要将指针初始化为0(NULL)。
如果是类类型的,只要定义了默认构造函数,在没有显式初始化时就会进行自动初始化。但是,对于内置和枚举类型的变量,并不是总会自动初始化。他们在什么时候不进行自动初始化从而造成悲剧呢?
函数体内定义时、动态数组创建时。
当对象是一个类类型或结构体时,它数据成员的初始化与任何变量初始化规则相同。所以如果类里面有内置类型或者复合类型的数据成员,则一定要在构造函数里对其进行显式的初始化
归根结底,内置类型和复合类型的变量自动初始化的情况并不经常出现,所以最好的方法还是按照C++ Primer的建议:每个内置类型的对象都要初始化!由于复合类型和内置类型自动初始化规则是一样的,所以我再加一句,每个复合类型的对象也都要初始化!而类类型的只要有默认构造函数就行了。所以说还是对象好啊。