【问题标题】:in C++, what would the the value of data-members be in class if we did not initialize them in constructor?在 C++ 中,如果我们没有在构造函数中初始化数据成员的值,那么它们在类中的值是多少?
【发布时间】:2016-06-23 12:27:14
【问题描述】:

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

【问题讨论】:

  • 视情况而定。这取决于很多事情。这取决于很多事情,我总是告诉人们,“如果有疑问,只需自己初始化所有内容。”
  • 你的意思是你有一个用户提供的构造函数,但是你没有显式地初始化数据成员?

标签: c++ class constructor


【解决方案1】:

初始化基和成员

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 非局部变量的初始化):

具有静态存储持续时间的非局部变量被初始化为 程序启动的结果。 ...

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

用户定义类型

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

【讨论】:

  • 默认构造函数真的初始化了它的成员吗?
  • @nickyC 这取决于。你可以写或不写。我不是说它会初始化它们。
  • 用户定义的类型也可以是 POD。此外,POD 术语是 C++11 之前的。
  • @juanchopanza 你是对的,它是 C++03。我已经为 C++11 更新了它。我希望今天有更多的 C++ 用户会喜欢它。
【解决方案2】:

类非静态成员 c++ 类没有默认初始化。 一旦分配了对象的内存,成员的值就会保存分配的内存中的任何内容。您可以将其视为“随机位”或“垃圾”。

What is the default value for C++ class members

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多