我的问题是关于班级数据成员的初始化。我想知道初始化规则,例如内置类型(int,double,float)和用户定义类型。如果我们没有初始化它们,它们的内容是未定义的,或者将使用默认构造函数?
答案 0 :(得分:5)
C ++ 11标准 12.6.2初始化基础和成员中描述了非静态数据成员的初始化:
...如果未指定给定的非静态数据成员或基类 通过mem-initializer-id ...,然后
- 如果实体是具有大括号或等于初始化程序的非静态数据成员,则实体初始化为 8.5;
- 否则,如果实体是变体成员(9.5),则不执行初始化;
- 否则,实体默认初始化(8.5)。
通话结束后 如果X的成员,则X类的构造函数已完成 在期间初始化或给出值 执行构造函数体的复合语句, 该成员具有不确定值。
注意:如果对象默认初始化且对象不是类或数组类型,则不执行初始化(参见8.5.6)。
示例强>:
struct A {
A();
};
struct B {
B(int);
};
struct C {
C() { } // initializes members as follows:
A a; // OK: calls A::A()
const B b; // error: B has no default constructor
int i; // OK: i has indeterminate value
int j = 5; // OK: j has the value 5
};
具有静态存储持续时间的变量初始化为零( 3.6.2非局部变量初始化):
具有静态存储持续时间的非局部变量初始化为a 程序启动的结果。 ...
具有静态存储持续时间的变量(3.7.1)...... 应在任何其他之前进行零初始化(8.5) 初始化发生。
对于用户定义的类型,调用默认构造函数(如果没有显式调用另一个构造函数,请参见上面的示例)。如果隐式声明构造函数(由编译器生成),则根据初始化基础和成员(参见上文)初始化成员。如果构造函数是用户定义的,则用户有责任初始化类成员。
答案 1 :(得分:0)
没有类非静态成员c ++类的默认初始化。 一旦分配了对象的内存,成员的值就会保存已分配内存中的内容。您可以将其视为"随机位"或"垃圾"。