将退出重载赋值运算符 invoke destructor 以删除对象

will exiting the overloaded assignment operator invoke destructor to delete the object

提问人:Daniel 提问时间:5/3/2014 更新时间:5/3/2014 访问量:64

问:

在 c++ 中,以下代码。

#include <iostream>
using namespace std;

class Object {

public:
   Object(int id){
     cout << "Construct(" << id << ")" << endl;
     m_id = id;
   }

   Object(const Object& obj){
      cout << "Copy-construct(" << obj.m_id << ")" << endl;
      m_id = obj.m_id;
   }

   Object& operator=(const Object& obj){
      cout << m_id << " = " << obj.m_id << endl;
      m_id = obj.m_id;
      return *this;
   }

   ~Object(){
       cout << "Destruct(" << m_id << ")" << endl;
   }
private:
   int m_id;

};

int main(){
   Object v1(1);
   cout << "( a )" << endl;
   Object v2(2);
   v2 = v1;
}

和相关输出

Construct(1)
( a )
Construct(2)
2 = 1

为什么在运算符之后,不调用。应该退出作用域并应该调用 ON 本身?不是这样吗?=destructorobj in operator =destructor

C++ 析构函数 赋值运算符

评论

0赞 user3288829 5/3/2014
您是通过引用传入的,所以不,不应调用析构函数obj
0赞 WhozCraig 5/3/2014
这还不是这个程序的全部输出。现场观看。不,在赋值运算符中没有隐式或显式的临时对象创建,正如您所说的那样,因此它本身既不会引入构造,也不会引入破坏。也许您正在考虑复制/交换习惯用语,以及它如何为异常安全分配构建临时值。(在这种情况下,这有点毫无意义,但如果某些 Object 成员是动态的,它将更加重要)。

答:

0赞 user207421 5/3/2014 #1

不。“obj”不是在作用域中创建的,因此它不会在作用域中被销毁。它是一个参数,也是一个参考。实际对象在别处。

评论

0赞 Lightness Races in Orbit 5/7/2014
什么?它是根据其中一个构造函数的参数构造的。它绝对应该在ass.op之后被销毁。返回。我责怪优化。2Object
0赞 user207421 5/8/2014
@LightnessRacesinOrbit 它在 main() 的末尾被销毁。它不会通过退出重载赋值运算符的作用域来销毁。阅读 question.r 阅读他询问为什么不调用析构函数的部分。
0赞 Lightness Races in Orbit 5/8/2014
它在它出现的完整表达式的末尾被销毁,这是构造它的函数调用,但由于我被困在移动设备上,网络移动性有限,并且没有足够的心思向上滚动并再次研究这个问题,我不会把我的代表押在那个:)
0赞 Lightness Races in Orbit 5/8/2014
好吧,我撒谎看了看,我认为这个问题很混乱。我能理解为什么人们会期望立即调用 ctor 参数的 dtor,但是,正如它所谈论的那样,您当然是正确的。我想知道他是否像我在最初的评论中大胆假设的那样,想问前者。v2op=
0赞 user207421 5/10/2014
@LighnessRacesInOrbit 恕我直言,我认为是你感到困惑。该问题明确指出了他所询问的范围退出。