提问人:Daniel 提问时间:5/3/2014 更新时间:5/3/2014 访问量:64
将退出重载赋值运算符 invoke destructor 以删除对象
will exiting the overloaded assignment operator invoke destructor to delete the object
问:
在 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 本身?不是这样吗?=
destructor
obj in operator =
destructor
答:
0赞
user207421
5/3/2014
#1
不。“obj”不是在作用域中创建的,因此它不会在作用域中被销毁。它是一个参数,也是一个参考。实际对象在别处。
评论
0赞
Lightness Races in Orbit
5/7/2014
什么?它是根据其中一个构造函数的参数构造的。它绝对应该在ass.op之后被销毁。返回。我责怪优化。2
Object
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,但是,正如它所谈论的那样,您当然是正确的。我想知道他是否像我在最初的评论中大胆假设的那样,想问前者。v2
op=
0赞
user207421
5/10/2014
@LighnessRacesInOrbit 恕我直言,我认为是你感到困惑。该问题明确指出了他所询问的范围退出。
评论
obj