【问题标题】:a compiler generated default constructor in c++编译器在 C++ 中生成默认构造函数
【发布时间】:2010-08-07 14:20:25
【问题描述】:

声明一个结构表:

struct Tables {
       int i;
       int vi[10];
       Table t1;
       Table vt[10];
};

Tables tt;

假设为 Table 定义了一个用户默认的构造函数。

这里 tt.t1 将使用 Table 的默认构造函数以及 tt.vt 中的每个元素进行初始化。

另一方面,tt.i 和 tt.vi 未初始化,因为这些对象不是类类型。

所以我们保留了一个半初始化的对象 tt。

如果我理解得很好 - 如果 tt.i 或 tt.vi 不会在代码中显式初始化,那么在创建 tt 之后,如果我们尝试从中读取值会引发错误?

2) 谁能给我解释一下,为什么 cpp 设计者不想简单地将内置类型 int 和 int[] 初始化为零?

【问题讨论】:

  • 我猜默认构造函数(即使它运行了)什么也没做。
  • 一切都与成本有关。 C++ 开发人员不想支付初始化成本,如果他们没有的话。见:stackoverflow.com/questions/1910832/…

标签: c++ object constructor


【解决方案1】:

不,不会抛出错误。您将有一个轻微的未定义行为案例。但是,由于整数没有陷阱值,因此无法检测到该行为。

请注意,C++ 语言本身抛出异常的情况非常非常少——我能想到的唯一情况是当通过dynamic_cast 对引用执行无效转换时,以及当new 失败时分配。当然,标准库可能会引发许多错误情况。

至于为什么 C++ 以这种方式工作(C 也是如此),良好的初始化需要时间,如果不需要,那就是浪费时间。例如,如果您要立即将用户输入读取到这些变量中,那么在您这样做之前初始化它们就没有什么意义了。

【讨论】:

  • 但我认为dynamic_cast 永远不会抛出任何错误?我相信如果类型不兼容,那么返回的指针将只是null
  • @phunehehe 投射到 reference 时抛出。
  • 谢谢内尔,我不知道。嗯,但我想我只是使用指针转换。
【解决方案2】:

不会抛出错误,这不是 Java。 :)

将返回的将是当时内存中发生的任何事情。你所拥有的是一个“未初始化”的变量。可能是 0,也可能是 42。每次都无法预测。

故事的寓意 - 初始化所有变量。不这样做可能会导致非常困难的错误。

由于这是 C++,请使用默认构造函数来初始化您的结构:

结构表{ 诠释我; 诠释六[10]; 表 t1; 表 vt[10]; 表(){ 我 = 0; for (int iter = 0; iter

【讨论】:

  • 严格来说,这不会初始化它们 - 它分配给它们。这是否是一个好主意取决于用户将如何处理它们。
【解决方案3】:

由于它们不是指针类型,因此它们将填充该位置堆栈上的任何内容。如果它们是指针类型并且您在没有正确初始化它们的情况下取消引用它们,那么是的,您会遇到问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2016-10-16
    • 2014-03-12
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多