C ++标准说(8.5 / 5):
默认初始化
T
类型的对象意味着:
如果
T
是非POD类类型(第9节),则调用T
的默认构造函数(如果T
具有T
,则初始化不正确没有 可访问的默认构造函数)。如果
struct Int { int i; }; int main() { Int a; }
是数组类型,则每个元素都是默认初始化的。否则,对象将被初始化为零。
使用此代码
a
对象a.i
是默认初始化的,但显然Int
不一定等于0。这与标准是否相矛盾,因为class
是POD而不是数组?
修改已从struct
更改为Int
,以便{{1}}为POD。
答案 0 :(得分:6)
从2003年标准的8.5.9开始:
如果没有为对象指定初始化程序,并且该对象是 (可能是cv限定的)非POD类类型(或其数组),. 对象应默认初始化;如果对象是 const-qualified类型,底层类类型应具有 用户声明的默认构造函数。 否则,如果没有初始化程序 为非静态对象,对象及其子对象指定,如果 任何,具有不确定的初始值);如果对象或任何 它的子对象属于const限定类型,程序格式不正确。
您显示的类是POD,因此突出显示的部分适用,您的对象根本不会被初始化(因此您引用的第8.5 / 5节根本不适用)。
编辑:根据您的评论,这里是当前标准最终工作草案第8.5 / 5节的引用(我没有真正的标准,但FDIS应该是非常的接近):
默认初始化T类型的对象意味着:
- 如果T是a(可能是 cv-qualified)类类型(第9节),T的默认构造函数是 调用(如果T无法访问,则初始化结果不正确 默认构造函数);
- 如果T是数组类型,则每个元素都是 默认初始化;
- 否则,不会执行初始化。
答案 1 :(得分:1)
您的变量未初始化。 使用
Int a = Int();
初始化你的POD或声明一个标准构造函数使其成为非POD; 但是出于性能原因,您也可以使用未初始化的POD,如:
Int a;
a.i = 5;
答案 2 :(得分:0)
不,对象a
未默认初始化。如果你想默认初始化它,你必须说:
Int a = Int() ;