【问题标题】:c++ default constructor fails to initialize public variables?c++ 默认构造函数无法初始化公共变量?
【发布时间】:2013-01-23 22:20:39
【问题描述】:

我有简单的示例:

#include <iostream>

class parent {
public:
    int i;
};

class child : public parent {
public:
    int d;
};

int main() {
    child c;
    std::cout << c.d << std::endl;
    return 0;
}

If you do not explicitly initialize a base class or member that has constructors by calling a constructor, the compiler automatically initializes the base class or member with a default constructor.

但是 c 中的所有整数(int d;int i;)都没有初始化。

它有什么问题?或者我没有看到明显的东西?

【问题讨论】:

  • stackoverflow.com/questions/563221/… 查看第一个答案部分的默认构造函数和 POD 的注释
  • 基本类型没有构造函数。见stackoverflow.com/a/5113385/1801919
  • 您提供的链接也适用于 Linux 编译器,而不是 VS2010
  • @LucasMarcondesPavelski 我认为从技术上讲该变量已初始化,但未初始化为零。
  • @juanchopanza :确实,虽然这里的正确术语是正确的术语是变量是 default-initialized 但不是 value-initialized

标签: c++ visual-studio-2010


【解决方案1】:

使用内置类型,您实际上必须自己进行初始化:

class parent
{
 public:
  parent() : i() {}
  int i;
};

这会将i 初始化为0

【讨论】:

  • 是标准化的还是仅限 VC++ 的?
  • 这称为值初始化
【解决方案2】:

内置数据类型(如int)并未真正初始化。他们的“默认构造函数”什么都不做,也没有默认值。因此,他们只会得到垃圾值。如果您希望内置数据类型具有特定值,则必须显式初始化它们。

【讨论】:

  • 例如,对于 Enums 和所有其他类简单数据类型(和复杂),我必须按照juanchopanza 的建议进行操作?
  • @myWallJSON:是的。除了std::complex 有一个将其成员初始化为零的构造函数。如果没有构造函数初始化某些东西(或明确分配给它的东西),那么它将有一个垃圾值。
【解决方案3】:

在没有构造函数和基本类型的类上进行的默认初始化和零初始化之间存在差异:

child c1;           // Default initialized. int types are not initialized.
child c2 = child(); // Zero initialized.    int types are in initialized to zero.
// In C++ 11
child c3 {};        // Use new syntax for zero initialization

更详细的解释:
在这里:https://stackoverflow.com/a/7546745/14065
这里:https://stackoverflow.com/a/8280207/14065

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多