为什么在创建对象数组时调用默认构造函数,但是当我将obj创建为简单变量时出错?

时间:2014-07-20 23:27:52

标签: c++ arrays

我知道在创建对象数组时会调用默认构造函数(可能是隐式的)。 但是,当我尝试检查默认初始化对象的公共变量时收到错误。

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编译器不同,它至少会发出警告。

1 个答案:

答案 0 :(得分:3)

这不是错误;这是一个警告。它通知您,您的Base,即POD,只有成员尚未初始化。

在您的其他示例中,编译器无法发出此警告。但是,在您访问number的所有情况下,您都违反了该语言的合同,因为该变量具有未指定的值。你说它输出“垃圾”,我不清楚为什么你期望任何不同;你没有给它任何有意义的价值,所以它没有任何有意义的价值。这就是事物的本质。这也意味着这意味着您的程序有未定义的行为,您需要修复它。

取消注释构造函数并调用它,使用聚合初始化(使用{}),或者在尝试从中读取之前为该number成员手动分配值