c++ - 为什么析构函数和复制构造函数会在对象数组中显示这种行为?
问题描述
当数组用匿名对象初始化时,析构函数显示有效值,但我用对象创建了一个数组,覆盖复制构造函数不调用,析构函数也显示垃圾值。
我尝试通过显示值来理解这一点,但仍然感到困惑。
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 CONSTRUCTOR\n";
}
~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
不是临时的,因此在这种情况下必须出现真实的副本。
推荐阅读
- c++ - 别名模板可以有默认模板参数吗?
- r - 当数据集中没有“计数”时如何按升序/降序排列条形图
- css - 如何为 Dark Reader 配置特定于站点的自定义插入符号颜色?
- c# - unity c# 通过注册变量实时控制其他脚本变量
- javascript - 第二个相同的断言在赛普拉斯中不起作用
- mysql - 如何将日期向后移动一定天数 v2
- excel - Excel公式提取x前面的数字不起作用
- swift - Swift:浏览器的搜索栏
- mongodb - MongoDB - 查找具有特定名称的字段存在的条目,嵌套在任何地方
- square-connect - Square Payments : 国际