gpt4 book ai didi

c++ - 为什么默认赋值运算符不先调用析构函数?

转载 作者:可可西里 更新时间:2023-11-01 15:20:10 26 4
gpt4 key购买 nike

因此在下面的示例中,我们使类 Foo 将自身替换为 *this = Foo()。我很高兴我刚刚测试了这个,因为在这种情况下,旧的 Foo 的析构函数没有被调用。我想那是因为默认赋值运算符只使用 memcpy ...但是作为一个语言设计问题...为什么不让默认赋值运算符首先销毁分配给对象以防止事故?

http://codepad.org/9WCo6yZ5

#include <iostream>
using namespace std;

class MustBeDestroyed //(for some reason not shown here)
{
public:
int i;
MustBeDestroyed(int i) : i(i) {}
~MustBeDestroyed() { cout << "destroyed contained class " << i << endl; }
};

class Foo
{
public:
MustBeDestroyed x;
Foo(int y) : x(y) {}
void replace_myself(int y) { Foo f(y); *this=f; }
void print() { cout << "This is outer/inner class " << x.i << endl; }
~Foo() { cout << "destroyed outer class " << x.i << endl; }
};

int main()
{
Foo a(1);
a.print();
a.replace_myself(2);
a.print();
return 0;
}

最佳答案

因为先销毁对象会结束生命周期。然后您将不得不调用构造函数来开始新对象的生命周期。但是 operator= 的行为不是销毁当前对象并创建另一个对象,而是为现有对象分配一个新值。

基本上,您违反了 3 的规则。

关于c++ - 为什么默认赋值运算符不先调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16341058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com