Rya*_*yan 1 c++ constructor class
我的问题是关于类数据成员的初始化.我想知道初始化规则,例如内置类型(int,double,float)和用户定义类型.如果我们没有初始化它们,它们的内容是未定义的,还是会使用默认的构造函数?
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
};
Run Code Online (Sandbox Code Playgroud)
具有静态存储持续时间的变量初始化为零(3.6.2非局部变量的初始化):
具有静态存储持续时间的非局部变量由于程序启动而初始化....
具有静态存储持续时间(3.7.1)的变量...应在任何其他初始化发生之前进行零初始化(8.5).
对于用户定义的类型,调用默认构造函数(如果没有显式调用另一个构造函数,请参见上面的示例).如果构造函数是隐式声明的(由编译器生成),则根据Initializing bases和members初始化成员(参见上文).如果构造函数是用户定义的,则用户有责任初始化类成员.