当使用复制构造函数为包含它的变量分配一个新对象时,上一个对象是否已销毁

Is the previous object destroyed when the variable holding it gets assigned a new one using a copy constructor?

本文关键字:对象 新对象 是否 一个对象 一个 构造函数 复制 包含它 分配 变量      更新时间:2023-10-16

看看这个代码:

#include <iostream>
using namespace std;
class A {
    private:
        int _x;
        int _id;
        static int count;
    public:
        A(int x) : _x(x) {
            this->_id = A::count++;
            cout << "Object with id "      << this->_id
                 << " has been created."   << endl;
        }
        ~A() {
            cout << "Object with id "      << this->_id
                 << " has been destroyed." << endl;
        }
        int get_x(void) {
            return this->_x;
        }
        A add(A& object) {
            A tmp(this->_x + object._x);
            return tmp;
        }
};
int A::count = 1;
int main(void) { 
    A object_1(13);
    A object_2(5);
    A object_3(12);
    object_3 = object_1.add(object_2);
    cout << object_3.get_x() << endl;

    return 0;
}

这是程序的输出:

Object with id 1 has been created.
Object with id 2 has been created.
Object with id 3 has been created.
Object with id 4 has been created.
Object with id 4 has been destroyed.
18
Object with id 4 has been destroyed.
Object with id 2 has been destroyed.
Object with id 1 has been destroyed.

我不明白id为3的Object发生了什么?它肯定是被创造出来的,但我看不到任何一行字告诉我它曾经被摧毁过。你能告诉我这里发生了什么事吗?

顺便问一句,为什么当我使用return 0时,析构函数工作得很好,但当我使用exit(EXIT_SUCCESS)时,我看不到屏幕上打印的Object with # has been destroyed,就好像析构函数从未被调用一样。

当使用复制构造函数为包含它的变量分配一个新对象时,上一个对象是否已销毁?

这个问题没有实际意义,因为这样做是不可能的

当你运行

object_a = object_b;

这将调用赋值运算符(而不是复制构造函数)。它不会创建或销毁任何对象(除非您的赋值操作符这样做)。

在这种情况下,您还没有定义赋值运算符,所以使用默认的赋值运算符,它用另一个对象的ID(即4)覆盖object_3的ID。因此,当object_3被销毁时,它会打印"id为4的对象已被销毁"。