现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

各类型变量的自动初始化总结

2012-09-03 19:25 工业·编程 ⁄ 共 832字 ⁄ 字号 暂无评论

    前几天给系统写一个新功能,被初始化问题搞毛了:一个结构体里包含枚举类型的变量,结果由于没有初始化,搞了一堆随机数……。这个结构体是作为输入参数放在查询函数里的,结果自然查不到。最悲剧的是,在我的Windows平台可以成功查到,Linux平台有一定几率能查到……

    如果一个变量没有进行初始化,那么使用它的行为是未定义的行为,这种行为有时正确有时错误,这就是我写的程序结果不确定的原因了。所以,一定不能依赖未定义的行为。

    吸取教训,以后要记得尽量初始化,特别是对于内置类型与枚举类型!但是,很多类型的变量在定义时是有默认值的。所以为了以后方便,还是整理一下。

    首先列出当变量自动初始化时,每个类型对应的默认值:

变量(对象)类型

默认值

布尔和所有整型

0

所有小数

0.0

char

‘’

string

“”

枚举类型

第一个枚举成员

其他类类型或结构体

默认构造函数

    另外,指针和引用类型的变量是不会自动初始化的,因为它没有一个默认值!当定义一个指针对象时,如int *pi; 此时它并未初始化,使用它很危险。应该在定义时直接初始化为它指向的对象。如果必须分开定义该指针和对象,要将指针初始化为0(NULL)。

如果是类类型的,只要定义了默认构造函数,在没有显式初始化时就会进行自动初始化。但是,对于内置和枚举类型的变量,并不是总会自动初始化。他们在什么时候不进行自动初始化从而造成悲剧呢?

函数体内定义时、动态数组创建时。

当对象是一个类类型或结构体时,它数据成员的初始化与任何变量初始化规则相同。所以如果类里面有内置类型或者复合类型的数据成员,则一定要在构造函数里对其进行显式的初始化

归根结底,内置类型和复合类型的变量自动初始化的情况并不经常出现,所以最好的方法还是按照C++ Primer的建议:每个内置类型的对象都要初始化!由于复合类型和内置类型自动初始化规则是一样的,所以我再加一句,每个复合类型的对象也都要初始化!而类类型的只要有默认构造函数就行了。所以说还是对象好啊。

给我留言

留言无头像?