c++ 运算符重载为什么要有返回值

边缘码农 2015-08-05 02:34:39
突然想到这些 比如
operator + (class T)
{
this.i += T.i //已经 实现了对象值相加

return *this // 都是这样实现的 这里有必要返回值么 上面已经改变了对象的值 功能已经实现 this.i的值已经改变 为什么还要这个句
}

可是看到好多都是有返回值 return *this 这样形式
当调用这个运算符时 a+b a的值已经是与b相加后的值 还是说+重载必须要有返回值 是否多此一举

这样不是矛盾着 + 已经实现了它的功能(改变类的值) 既然已改变(this.i += T.i) 为何要返回值 求解 谢谢
...全文
602 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2015-08-06
  • 打赏
  • 举报
回复
返回值是为了可以连着写 比如 a + b + c
paschen 版主 2015-08-06
  • 打赏
  • 举报
回复
当你写成: c = a + b的时候执行的是 c = a.operate +(b), 所以需要返回值
Saleayas 2015-08-06
  • 打赏
  • 举报
回复
重载是不改变语法的,运算符是一个表达式,必须有值得。
Qt讷讷熊 2015-08-06
  • 打赏
  • 举报
回复
引用 9 楼 lm_whales 的回复:
运算符重载要保证和内置运算符具有相同的含义, 才能保证不会误用
这个回答才像话. 在不用多说明的情况下, 程序员即可使用一个类的重载+运算. 否则实现一个类自己搞一套规则, 不是为使用者挖了一地的坑么. 这也符合一种语言设计的普遍规则. 通用为主, 专用为辅.
  • 打赏
  • 举报
回复
引用 11 楼 Saleayas 的回复:
重载是不改变语法的,运算符是一个表达式,必须有值得。
就是这么回事!
mewiteor 2015-08-05
  • 打赏
  • 举报
回复
好像结果做为左值的话就 return *this 吧
lm_whales 2015-08-05
  • 打赏
  • 举报
回复
运算符重载要保证和内置运算符具有相同的含义, 才能保证不会误用
fly_dragon_fly 2015-08-05
  • 打赏
  • 举报
回复 1
operator+通常是建议用非成员函数实现, 这样才能保证a+b不会改变a
zxx178239 2015-08-05
  • 打赏
  • 举报
回复
相加结果必然要用一个对象来保存,自然要用到赋值号,既然要用到赋值号,自然需要返回值 即不论是a += b还是 c = a + b,都需要加完保存
苏叔叔 2015-08-05
  • 打赏
  • 举报
回复
如果有这种需求∶a=b+c;就需要有返回值
dustpg 2015-08-05
  • 打赏
  • 举报
回复
引用 2 楼 caotameiddd 的回复:
回复1楼上 @dustpg 我说的重载 + 这样的操作符 测试了下 int main(int argc, char* argv[]) { class a { public: a(int i):m_i(i) {}; int m_i; a &operator + (a &T) {this->m_i += T.m_i; return *this;} }; a tom(2), joy(3); tom+joy; return 0; } a+b; 这样的话a值是肯定要改的 我的问题是重载时的返回值 两种怀况在汇编下比较了下 {this->m_i += T.m_i; /*return *this;*/ } //无返回值 00401040 8B 44 24 04 mov eax,dword ptr [esp+4] 00401044 8B 10 mov edx,dword ptr [eax] 00401046 8B 01 mov eax,dword ptr [ecx] 00401048 03 C2 add eax,edx 0040104A 89 01 mov dword ptr [ecx],eax 0040104C C2 04 00 ret 4 {this->m_i += T.m_i; return *this;} //有返回值 00401040 8B C1 mov eax,ecx 00401042 8B 4C 24 04 mov ecx,dword ptr [esp+4] 00401046 8B 11 mov edx,dword ptr [ecx] 00401048 8B 08 mov ecx,dword ptr [eax] 0040104A 03 CA add ecx,edx 0040104C 89 08 mov dword ptr [eax],ecx 0040104E C2 04 00 ret 4 两种情况基本一样 都是 取得 两个对象的值然后 相加 add ecx, edx 和 add eax,edx =5 然后 mov dword ptr [ecx],eax 和 mov dword ptr [eax],ecx是一样的功能 把相加结果存储到调用对象 这样看编译器对两种情况是相同处理的不知道这样理解对不对 QAQ
返回值肯定要用,不用的话编译器会优化掉的. 比如 (tom+joy) + joy
bear234 2015-08-05
  • 打赏
  • 举报
回复
楼主要活学活用啊 你是程序员 你就是程序的上帝啊 你想让它怎样它就得怎样 如果你写的某个class的+确实不需要返回值,那你就不要反回呗 只不过,c = a + b; 这肯定是需要返回值的
边缘码农 2015-08-05
  • 打赏
  • 举报
回复
回复1楼上 @dustpg 我说的重载 + 这样的操作符 测试了下 int main(int argc, char* argv[]) { class a { public: a(int i):m_i(i) {}; int m_i; a &operator + (a &T) {this->m_i += T.m_i; return *this;} }; a tom(2), joy(3); tom+joy; return 0; } a+b; 这样的话a值是肯定要改的 我的问题是重载时的返回值 两种怀况在汇编下比较了下 {this->m_i += T.m_i; /*return *this;*/ } //无返回值 00401040 8B 44 24 04 mov eax,dword ptr [esp+4] 00401044 8B 10 mov edx,dword ptr [eax] 00401046 8B 01 mov eax,dword ptr [ecx] 00401048 03 C2 add eax,edx 0040104A 89 01 mov dword ptr [ecx],eax 0040104C C2 04 00 ret 4 {this->m_i += T.m_i; return *this;} //有返回值 00401040 8B C1 mov eax,ecx 00401042 8B 4C 24 04 mov ecx,dword ptr [esp+4] 00401046 8B 11 mov edx,dword ptr [ecx] 00401048 8B 08 mov ecx,dword ptr [eax] 0040104A 03 CA add ecx,edx 0040104C 89 08 mov dword ptr [eax],ecx 0040104E C2 04 00 ret 4 两种情况基本一样 都是 取得 两个对象的值然后 相加 add ecx, edx 和 add eax,edx =5 然后 mov dword ptr [ecx],eax 和 mov dword ptr [eax],ecx是一样的功能 把相加结果存储到调用对象 这样看编译器对两种情况是相同处理的不知道这样理解对不对 QAQ
dustpg 2015-08-05
  • 打赏
  • 举报
回复
一般来讲,+操作符不对对象进行修改,比如,
int a = 0, b = 1;
int c = a + b;
运算后,a是不变的,+ 操作符一般来讲必须返回一个临时对象。 对于+=运算符,也是要返回一个对象
    int a = 0;
    (a += 1) += 1;
C++允许这样写,所以也要返回一个对象。 详情可以搜索关键字: C++ 表达式的副作用, C++ 顺序点

64,282

社区成员

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

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