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

Why default constructor is called when I create an array of objects, but errors out when I create obj as simple variable?

本文关键字:创建 obj 简单 出错 变量 构造函数 数组 一个对象 调用 默认 为什么      更新时间:2023-10-16

我知道默认构造函数(可能隐式)被调用时,对象数组的创建。然而,当我试图检查默认初始化对象的公共变量时,得到一个错误。

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专业版)

编辑:下面是来自Intel 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编译器。

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

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

获取未注释的构造函数并调用它,使用聚合初始化(使用{}),或者在试图读取它之前手动为number成员赋值。