在C++中,如果我们没有在构造函数中初始化数据成员,那么数据成员的值是什么?

Rya*_*yan 1 c++ constructor class

我的问题是关于类数据成员的初始化.我想知道初始化规则,例如内置类型(int,double,float)和用户定义类型.如果我们没有初始化它们,它们的内容是未定义的,还是会使用默认的构造函数?

Luk*_*řík 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
};
Run Code Online (Sandbox Code Playgroud)

对象具有静态存储持续时间

具有静态存储持续时间的变量初始化为零(3.6.2非局部变量的初始化):

具有静态存储持续时间的非局部变量由于程序启动而初始化....

具有静态存储持续时间(3.7.1)的变量...应在任何其他初始化发生之前进行零初始化(8.5).

用户定义的类型

对于用户定义的类型,调用默认构造函数(如果没有显式调用另一个构造函数,请参见上面的示例).如果构造函数是隐式声明的(由编译器生成),则根据Initializing bases和members初始化成员(参见上文).如果构造函数是用户定义的,则用户有责任初始化类成员.