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

时间:2016-03-09 08:23:15

标签: c++ class constructor

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

2 个答案:

答案 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 ++类的默认初始化。 一旦分配了对象的内存,成员的值就会保存已分配内存中的内容。您可以将其视为"随机位"或"垃圾"。

请参阅What is the default value for C++ class members