当在c ++中重载“==”运算符时,是否存在关于明确意味着什么的标准定义,或者“==”应该如何表现的一组准则?
我目前有一个类不会将其整个自我存储在内存中。它基本上使用优先级队列来确定自身内部对象的使用频率,以及何时从队列末尾弹出对象,将它们从内存中删除并写入磁盘。
所以现在问题出现在相等的问题上,这两个对象的相同之处是什么意思。因为我们可以从对象A和B开始,它们在各方面都是相同的,所以它们将相同的数据加载到内存中,并且它们在磁盘上具有相同的数据。但是在调用A和B上的一系列函数后,它们现在可能会有所不同。 A和B在磁盘上仍然具有相同的数据,但它们将不同的数据加载到内存中。所以问题是A == B
应该解决为真还是假?
是否有一套规则或指南可以定义这应该如何运作?或者这只是一种情况,我决定什么对程序最有意义,并记录“==”的作用?
答案 0 :(得分:16)
任何operator==
重载都应该尊重equivalence relation的公理,即
x == x
,适用于所有对象x
x == y
,则y == x
x == y
和y == z
,则x == z
。许多使用==
的算法依赖于它实现等价关系,在§17.6.3.1中形式化为EqualityComparable
概念。
答案 1 :(得分:11)
标准中没有关于重载operator ==
应如何表现的定义。
但是一个足够好的指导原则 - 如果你必须考虑它,你可能甚至不应该超载operator ==
。如果它不直观,那就弊大于利。
所以问题是A == B应该解析为真还是假?
IMO,它应该导致编译器错误。 :)
答案 2 :(得分:2)
所有运算符重载都应该“满足您的期望”。如果对象基本上不相同,则运算符==没有意义返回true。你如何定义“相同”当然是我们可以争论的东西。可以实现一个“nocasestring”,它的行为就像一个字符串,但是如果你有一个字符串“HELLO”和一个“hello”,它们被认为是相同的,因为情况并不重要。或者,如果您实现了自己的“Float”类,其中==进行一些数学运算以避免常规浮点的脆弱比较。所以是的,有些情况下==不能完全“对所有元素都是。== b。”,但它应该是例外。
同样,如果一个运算符没有完全意义,不要让它做一些“令人惊讶”的事情(例如-
表示字符串 - 它做什么?或者将一个字符串乘以另一个字符串 - 乘以整数可能有意义)。
编程中的惊喜是一个坏主意。如果事情不按照你的方式工作,你会因阅读/修改代码而获得糟糕的体验。