社区
C++ 语言
帖子详情
关于运算符==和!=的重载
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++ 类的赋值
运算符
”
=
”
重载
的方法实现
什么类需要
重载
赋值
运算符
先来看一个普通类的直接赋值。 #include using namespace std; class person{ int age; public: person(const int& a
=
10):age(a){} //构造函数 ~person(); //析构函数 void showAdd...
重载
运算符
=
在做
关于
链表的应用通讯录时有对象与对象的比较,故需要将“
=
”
重载
。 参考:http://www.runoob.com/cplusplus/cpp-overloading.html
重载
的
运算符
是带有特殊名称的函数,函数名是由关键字 operator
和
其后要
重载
的...
关于
=
=
运算符
重载
今天在写代码的时候遇到这样一个问题:自定义了一个类,为了在对两个实例比较时方便,所以
重载
了
=
=
运算符
,当然也同样
重载
了
!
=
运算符
。在测试的时候却出现了stack overflow的问题。 代码如下(当然不是真正的代码,...
=
运算符
重载
=
运算符
重载
要注意以下问题 是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用。 只有返回一个引用,才可以允许连续赋值。例如:str1
=
str2
=
str3; 是否把传入参数的类型设为常量引用。 ...
【C++】[ ]、
=
、
=
=
、
!
=
运算符
重载
(以数组为例)
[ ],
=
=
,
!
=
运算符
重载
发帖
C++ 语言
微信扫一扫
点击复制链接
分享社区
下载分享明细
6.2w+
社区成员
25.0w+
社区内容
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
帖子事件
创建了帖子
2004-01-17 04:49
社区公告
暂无公告