c++ - 为什么析构函数和复制构造函数显示对象数组的这种行为?

标签 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};

obj1obj2 不是临时的,因此在这种情况下必须出现真正的拷贝。

关于c++ - 为什么析构函数和复制构造函数显示对象数组的这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55389782/

相关文章:

c++ - 当我迭代它时,我可以从 std::list 中删除元素吗?

c++ - Boost asio 绑定(bind)读取处理程序

java - 快速 java/python/C++ ipc

c++ - sqlite3_exec 回调是同步的还是异步的?

c++ - 隐藏的 Vim 标签文件

c++ - Cocos2d:错误没有合适的从 Cocos2d::Valuemap 到 Cocos2d::CCdictionary 的转换函数存在

c++ - 堆分配变量的返回值优化和初始化

c++ - 两个对象似乎共享同一个地址

c++ - QT_VERSION 不正确?

c++ - 无法在 kernel32.dll 中找到 GetOverlappedResultEx