我知道在创建对象数组时会调用默认构造函数(可能是隐式的)。 但是,当我尝试检查默认初始化对象的公共变量时收到错误。
class Base {
public:
int number;
//Base(int a, int b) {} // inhibits creation of def. ctor
};
Base b;
//std::cout << b.number << std::endl;
// prev line generates error:
// Error 3 error C4700: uninitialized local variable 'b' used
Base a[10];
// prints garbage, no errors
std::cout << a[0].number << std::endl;
Base *p = new Base[10];
// prints garbage, no errors
std::cout << p[0].number << std::endl;
https://stackoverflow.com/a/22795079/465292注明int falls into the category of "non-default-initialized types" as per §8.5/7:
因此,显然对于数组类型,在单个元素上调用隐式构造函数。根据前面的句子,为什么std::cout << a[0].number << std::endl;
没有产生错误? (使用Visual Studio 2013专业版)
编辑: 这是英特尔C ++编译器的输出
1>Source.cpp(37): warning #592: variable "a" is used before its value is set
1> std::cout << a[0].number << std::endl;
1> ^
1>
1> xilink: executing 'link'
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
它也打印垃圾。与VS编译器不同,它至少会发出警告。
答案 0 :(得分:3)
这不是错误;这是一个警告。它通知您,您的Base
,即POD,只有成员尚未初始化。
在您的其他示例中,编译器无法发出此警告。但是,在您访问number
的所有情况下,您都违反了该语言的合同,因为该变量具有未指定的值。你说它输出“垃圾”,我不清楚为什么你期望任何不同;你没有给它任何有意义的价值,所以它没有任何有意义的价值。这就是事物的本质。这也意味着这意味着您的程序有未定义的行为,您需要修复它。
取消注释构造函数并调用它,使用聚合初始化(使用{}
),或者在尝试从中读取之前为该number
成员手动分配值