关于运算符==和!=的重载

qiaojicheng 2004-01-17 04:49:43
为什么重载了==运算符后还需要重载!=运算符才能使用!=呢?反过来也一样。这两个运算符为什么不互相关联呢?
...全文
50 23 打赏 收藏 举报
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qiaojicheng 2004-01-19

----------------------------------------------------------------
原贴内容:
你验证过吗?看了源代码还是看了权威的书上这么讲的?
类中有这样的重载确实可以获得,但还是要显式定义的,不然编译器不认。

其实搂主是对的,在STL中,定义了 <和==号即可获得其他所有的比较运算符号

当然,不过使用的时候需要使用如下声明:using namespace std::rel_ops;
  • 打赏
  • 举报
回复
darkhawk 2004-01-19
虽然你的行为==和!=号可以有语义不一致的情况,此时C++会优先使用你的定义,但是其实只要定义了<,==操作符号之后,其他的比较运算符号都可以获得,不过,需要使用如下的声明:
using namespace std::rel_ops;
参看C++标准程序库
  • 打赏
  • 举报
回复
sharkhuang 2004-01-18
如果能分辨出来!那你的==也不用重载了
  • 打赏
  • 举报
回复
qiaojicheng 2004-01-18
其实我的意思很简单,对
Wolf0403(完美废人,向数据结构致敬) ( ) struct Test
{};

bool operator==(const Test&, const Test&){return true;}
bool operator!=(const Test&, const Test&){return true;}

你又奈我何如?嘿嘿

的这种做法,不符合运算符重载的思想,应该从标准中加以避免,既只允许重载二者之一,但是标准为什么不这样做?大家能否推断一下C++标准制定者的想法,比较合理的。这样做和不这样做利弊如何?


  • 打赏
  • 举报
回复
liansdan 2004-01-18
http://li696.2003y.net
一个新建的C论坛网站
可以随便发表文章
说大家想说的
没有任何限制
比CSDN更自由
  • 打赏
  • 举报
回复
jettylee 2004-01-17
楼上的说的够清楚了~~

  • 打赏
  • 举报
回复
BluntBlade 2004-01-17
对C++来说,内建数据类型的==和!=可能被认定为不相关的操作符。
为了保持程序行为一致,用户定义类型(比如类)的==和!=也被认定为不相关的操作符。
所以如果想只维护一个版本的==和!=的话,可以在==中对结果取反,从而得到!=。比如:

inline boolean operator ==(const T & lhs, const T & rhs)
{
return lhs.Compare(rhs);
}

inline boolean operator !=(const T & lhs, const T & rhs)
{
return (! T::operator==(lhs,rhs));
}

这样只需要维护一个操作符,另一个操作符会自动同步。
  • 打赏
  • 举报
回复
soyan 2004-01-17
运算符只能被显式重载,不存在隐式重载
  • 打赏
  • 举报
回复
Wolf0403 2004-01-17
struct Test
{};

bool operator==(const Test&, const Test&){return true;}
bool operator!=(const Test&, const Test&){return true;}

你又奈我何如?嘿嘿
  • 打赏
  • 举报
回复
lan99 2004-01-17
两个操作符嘛,机器哪里有那么灵活呢
  • 打赏
  • 举报
回复
KingSeaMountain 2004-01-17
哈哈

赶明儿向C++标准化委员会反映反映
  • 打赏
  • 举报
回复
darkhawk 2004-01-17
其实搂主是对的,在STL中,定义了<和==号即可获得其他所有的比较运算符号
  • 打赏
  • 举报
回复
qiaojicheng 2004-01-17
机器是死的,可以编译器是活的呀,如果调用!=可以通过调用==取反实现嘛,反之亦然,这样就避免了上述逻辑错误的可能性了。
  • 打赏
  • 举报
回复
qiaojicheng 2004-01-17
举个例子:
int a,b;
if(a != b)编译器对a!=b这个条件的判断无论是调用==还是!=都是可以的,一样的到一个正确的结果,这和人的思维是一致的,如果你证明了他们==,那也就同时证明了他们不!=。如果重载了两个运算符,就可能出现违背逻辑的情况,两个类既==又!=。
  • 打赏
  • 举报
回复
Leung_ 2004-01-17
也许机器是死的,它不知道由==可以得到!=
重载了其中一个,另一个应该很容易重载吧?作一次调用就行了。
  • 打赏
  • 举报
回复
Ghoscorpion 2004-01-17
因为更本就是两个操作符的原因吧……
  • 打赏
  • 举报
回复
qiaojicheng 2004-01-17
我得意思是说你重载了==,也就隐含了!=。
  • 打赏
  • 举报
回复
qiaojicheng 2004-01-17
两个操作互反,有其一必知其二,为什么还要都定义呢?岂不是不符合语意了嘛?
  • 打赏
  • 举报
回复
Leung_ 2004-01-17
假定自定义了一个class A, 有两个A的对象a1, a2
编译器可能不知道a1, a2怎样才算相等,因此需要对A重载==与!=操作符。
  • 打赏
  • 举报
回复
xiyi168 2004-01-17
没有关系啊
  • 打赏
  • 举报
回复
加载更多回复(3)
发帖
C++ 语言

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2004-01-17 04:49
社区公告
暂无公告