为什么析构函数和复制构造函数使用对象数组显示此行为
Why destructor and copy constructor is showing this behavior with array of objects?
当数组使用匿名对象初始化时,析构函数显示有效值,但我创建一个包含对象的数组,覆盖复制构造函数不调用,析构函数也显示垃圾值。
我试图通过显示值来理解这一点,但仍然感到困惑。
class Check{
private:
int a;
public:
Check()
{
this->a = 9999;
cout << "n Default Constructor Called n";
}
Check(int i)
{
this->a = i;
}
Check(const Check & obj)
{
cout << "COPY CONSTRUCTORn";
}
~Check()
{
cout << this->a<<" DESTRUCTOR n";
}
};
Check b[2] = {Check(5),Check(4)};
Check obj1(2);
Check obj2(3);
Check a[2] = {obj1,obj2};
我期待"COPY CONSTRUCTOR"输出 4 次,但只有两次,没有垃圾值。实际输出如下所示:
COPY CONSTRUCTOR COPY CONSTRUCTOR 32649 DESTRUCTOR -1330935392 DESTRUCTOR 3 DESTRUCTOR 2 DESTRUCTOR 4 DESTRUCTOR 5 DESTRUCTOR
原因是因为复制省略。
在这种情况下:
Check b[2] = {Check(5),Check(4)};
由于这两个值都是临时值,因此允许编译器(或者在 C++17 中强制(优化副本,而是就地构造对象。
但是,在第二种情况下:
Check a[2] = {obj1,obj2};
obj1
和obj2
不是临时的,因此在这种情况下必须出现真实副本。
在:
Check b[2] = {Check(5),Check(4)};
此语法意味着两个数组元素的构造函数参数是 5
和 4
。 这并不意味着这些论点是暂时的。
Check(5)
是一个 prvalue 表达式,但这并不一定意味着暂时的实现。可以"使用"prvalue 的方法之一是作为相同类型的对象的初始值设定项。
这种行为在 C++17 中发生了变化;在此之前,概念上总是有一个临时的,但编译器可以自行决定省略临时的。
相关文章:
- 显示数组中的学生 ID 和最高分
- 我编写了一个程序来显示数组的内容,但它显示的是它的地址
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 使用指针显示数组的值
- 我无法显示包含整数最大值的索引. 但我可以显示数组中整数的最高值
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?
- 使用增量/减少操作员在C 中显示数组的奇怪结果
- 将25个甚至整数存储到一个名为intlist的整数阵列中,然后在屏幕上显示数组,并在屏幕上显示名为fivintegers
- 显示数组的问题.一切都放在一个单独的行中,但不放入单独的列中
- strlen 显示数组元素的数量错误
- 我的函数不会用" "替换".",也不会按预期显示数组
- 以C++为单位乘以并显示数组的值
- 找不到标识符,尝试在 C++ 中显示数组值
- 如何显示数组名称中的名称
- 在列表小部件 Qt C++中显示数组内容
- c++将.txt文件中的字符串添加到字符串数组中,并显示数组的值
- C++如何将数组传递给函数,然后调用它来显示数组的值
- 从函数更新(覆盖)和显示数组
- 在单独的数据中显示数组数据
- 仅显示数组文本文件中的第一个字母