声明结构表:
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 []初始化为零?
答案 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)
由于它们不是指针类型,因此它们将填充该位置的堆栈中的任何内容。如果它们是指针类型,并且在没有正确初始化它们的情况下取消引用它们,那么肯定会有问题。