c++Primer运算符重载问题

BYSF_XF 2013-10-06 12:36:30
书上说的,对称操作符,如自述操作符相等操作符,关系操作符和位操作符最好定义为非成员函数。
我想知道为什么?
...全文
85 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
BYSF_XF 2013-10-06
  • 打赏
  • 举报
回复
引用 4 楼 BYSF_XF 的回复:
[quote=引用 1 楼 u010222864 的回复:] 你要知道位操作符返回的值是什么?即他的左操作数的问题,他必须是流,不然无法进行std::cout << p << w << std::endl;这样连续的输出对象,而成员函数的左操作数被绑定为对象自身了,你最多返回的是对象本身,是无法返回流的,这就是为什么将操作符定义为friend或者普通函数的原因。 关系操作符最好是定义为非成员函数,这不是强求,只是建议,这是人家总结的,可能与效率有关
引用 2 楼 u010222864 的回复:
可能你会这么写std::ostream& operator <<(std::ostream &os); 如果这么写,你就必须明白这会导致输出对象的顺序,他此时是从后往前输出的,不符合逻辑的东西,这可能被限制了
那我昨天测试的一个成员重载+号:

class Object {
//...
    string operator+(Object obj) {
        //...
    }
};
编译能通过,并且运行正常啊?[/quote] 我好像明白什么了,谢谢大家
BYSF_XF 2013-10-06
  • 打赏
  • 举报
回复
引用 1 楼 u010222864 的回复:
你要知道位操作符返回的值是什么?即他的左操作数的问题,他必须是流,不然无法进行std::cout << p << w << std::endl;这样连续的输出对象,而成员函数的左操作数被绑定为对象自身了,你最多返回的是对象本身,是无法返回流的,这就是为什么将操作符定义为friend或者普通函数的原因。 关系操作符最好是定义为非成员函数,这不是强求,只是建议,这是人家总结的,可能与效率有关
引用 2 楼 u010222864 的回复:
可能你会这么写std::ostream& operator <<(std::ostream &os); 如果这么写,你就必须明白这会导致输出对象的顺序,他此时是从后往前输出的,不符合逻辑的东西,这可能被限制了
那我昨天测试的一个成员重载+号:

class Object {
//...
    string operator+(Object obj) {
        //...
    }
};
编译能通过,并且运行正常啊?
whdugh 2013-10-06
  • 打赏
  • 举报
回复
如果定义为成员函数,那应该返回左操作数,但是比如关系运算符,应该返回两个对象比较的结果,而非对象。嗯。我是这样理解的。
SmallCoder1992 2013-10-06
  • 打赏
  • 举报
回复
可能你会这么写std::ostream& operator <<(std::ostream &os); 如果这么写,你就必须明白这会导致输出对象的顺序,他此时是从后往前输出的,不符合逻辑的东西,这可能被限制了
SmallCoder1992 2013-10-06
  • 打赏
  • 举报
回复
你要知道位操作符返回的值是什么?即他的左操作数的问题,他必须是流,不然无法进行std::cout << p << w << std::endl;这样连续的输出对象,而成员函数的左操作数被绑定为对象自身了,你最多返回的是对象本身,是无法返回流的,这就是为什么将操作符定义为friend或者普通函数的原因。 关系操作符最好是定义为非成员函数,这不是强求,只是建议,这是人家总结的,可能与效率有关

64,439

社区成员

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

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