编译器在c ++中生成的默认构造函数

时间:2010-08-07 14:20:25

标签: c++ object constructor

声明结构表:

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

Tables tt;

假设为Table定义了user-deault构造函数。

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

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

所以我们继续使用半初始化对象tt。

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

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

3 个答案:

答案 0 :(得分:4)

不,不会抛出任何错误。您将有一个未定义行为的温和情况。但是,由于整数没有陷阱值,因此无法检测到该行为。

请注意,C ++语言本身只会非常非常少地抛出异常 - 关于我通过dynamic_cast执行对引用的无效强制转换以及{{1无法分配。当然,标准库可能会出现许多错误情况。

至于为什么C ++以这种方式工作(以及C也是如此),初始化需要时间,如果不需要则浪费时间。例如,如果您要立即将用户输入读入这些变量,那么在您执行此操作之前初始化它们几乎没有意义。

答案 1 :(得分:3)

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

将返回的内容将是当时记忆中发生的任何事情。你拥有的是一个“未初始化”的变量。它可能是0.它可能是42.每次都会出现不可预知的事情。

故事的道德 - 初始化所有变量。如果不这样做,可能会导致非常困难的错误。

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

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

Tables() {
  i = 0;
  for (int iter = 0; iter < 10; iter++)
    vi[iter] = 0;
}

}; 

Tables tt; 

答案 2 :(得分:1)

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