关于operator+的小问题

Benni 2011-08-22 04:19:57
有个类叫MyClass吧, 析构函数里面会释放相关资源,现在重载了 operator+, 和 operator+=
MyClass operator + (MyClass &a)
{
MyClass b(*this);
b += a;
return b;
}

现在:
MyClass x, y, c;

x = ....
y = ....
以上两步假设是x,y是赋予了具体内容的。

现在
c = x + y;

发现, 在MyClass operator + (MyClass &a) 的 return b;处, b是正确的, 但是接下来马上调用了b的析构函数, b被清空了, 导致c = x + y;最后结果是那个函数里面被清空的b。 如何才能正确呢?



...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 benni 的回复:]

回楼上, operator= 是重载的了, 关键是进入到 operator=的那个参数是被析构了的对象b, 所以无法获得正确值
[/Quote]
把你的operator= 发出来看看
Benni 2011-08-23
  • 打赏
  • 举报
回复
回楼上, operator= 是重载的了, 关键是进入到 operator=的那个参数是被析构了的对象b, 所以无法获得正确值
Longerandlonger 2011-08-22
  • 打赏
  • 举报
回复
MyClass x, y, c; // c已经被构造了
x = ....
y = ....
c = x + y; // 你这里调用的是 MyClass::operator= (const MyClass& arg),不是拷贝构造函数。
// 如果你没有重载这个赋值函数,那么编译器会自动生成一个operator= ()函数。
// 这个生成的函数是“低智能”的,比如:

// 假设MyClass有一个成员变量string* m_pStr,是new出来的,
// 则那个自动生成的operator= ()函数执行的动作将会是:this.m_pStr = arg.m_pStr 。
// 执行c = x + y的时候,arg就是一个临时的MyClass,
// c.m_pStr与arg.m_pStr指向同一块内存。
// 执行完c = x + y之后,arg析构了,arg.m_pStr指向的内存也delete了,
// 而c.m_pStr仍然指向那块已经delete的内存。
v_table 2011-08-22
  • 打赏
  • 举报
回复
b被清空了无所谓,因为返回时会产生一个临时对象,这就需要你拷贝构造函数是深拷贝。。
gules 2011-08-22
  • 打赏
  • 举报
回复

const MyClass operator+ (const MyClass& lhs, const MyClass& rhs)
{
MyClass temp(lhs);
temp += rhs;
return temp;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧