当使用复制构造函数为包含它的变量分配一个新对象时,上一个对象是否已销毁
Is the previous object destroyed when the variable holding it gets assigned a new one using a copy constructor?
看看这个代码:
#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的对象已被销毁"。
相关文章:
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 重用对象与创建新对象
- C++,创建新对象时类的对象更改
- 运算符重载 += 添加新对象
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 从使用概念定义的函数返回新对象
- 从 Rcpp 函数返回指向"新"对象的指针的正确方法
- 如何删除派生类中基类对象的新对象
- 有没有一种方法可以从函数中返回一个新对象或对现有对象的引用
- 为模板参数类型中的新对象分配内存
- 删除通过取消引用新对象初始化的对象
- C++ 实例化新对象时不接受继承方法默认参数值
- 有没有办法删除传递给函数"foo(新对象())"的对象?
- 将 Eigen::MatrixXd 转换为 arma::mat 并在新对象上制作副本
- 创建新对象并立即为其设置属性时出现编译器错误
- 如何异步销毁对象并立即分配一个新对象
- 删除传递给 C++ 中成员函数的新对象
- 具有构造函数的新对象数组,需要在C++中设置参数
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?