为什么当我创建一个对象数组时调用默认构造函数,但当我将obj创建为简单变量时却出错
Why default constructor is called when I create an array of objects, but errors out when I create obj as simple variable?
我知道默认构造函数(可能隐式)被调用时,对象数组的创建。然而,当我试图检查默认初始化对象的公共变量时,得到一个错误。
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
成员赋值。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 如何禁用在工厂方法之外创建/复制 obj?
- 从 Objective-c 委派到 c(或者更好地称之为:创建从 C 到 OBJ-C 的侦听器)
- 我无法在 Flutter 桌面嵌入项目(在 Visual Studio 上)中创建 obj 文件
- 动态数组C++,新 Obj[size] 只创建 1 个对象指针而不是数组时出现问题
- 在 XCode 中创建一个要在 Obj-C 中使用的C++库
- 创建obj时出现错误标头C++
- 为什么在静态创建 OBJ 时调用私有析构函数
- 如何在创建新的 obj() 时调用基类构造函数 new base(argT argV)
- 创建新项目时未生成 helloworld.obj 文件
- 使用C++/Obj-C创建小部件
- 为什么当我创建一个对象数组时调用默认构造函数,但当我将obj创建为简单变量时却出错
- 我的旧Qt项目文件(.pro文件),它正在工作;不创建任何文件(moc_ 或 .obj 文件)。为什么它退出构建步骤什么都不做?
- 构造函数 c++ Object obj = Object( "string" , 22);正在创建临时对象?
- 是否可以在构造函数中访问当前的"创建"obj?
- 用new关键字创建obj和直接创建obj有区别吗?