2010-02-06 144 views
5

重载运算符时,是否有必要重载> = < =和!=?运算符重载C++

对于运算符< =和!!调用!operator = for!=,!>看起来像是聪明的!运营商> =的<。

是这种情况,还是有必要重载每个功能?

回答

2

是的,这是必要的,如果你想让他们所有的工作方式,你希望他们的工作。

C++不强制大多数可重载操作符的任何特定语义。唯一固定的是操作符的一般语法(包括一元或二元以及诸如优先和关联等)。这立即意味着您在过载中实现的实际功能可能是绝对任意的。在一般情况下,运营商==的作用与运营商!=的作用之间可能没有任何有意义的联系。运算符==可能会将数据写入文件,而运算符!=可能会对数组进行排序。

虽然以这种任意方式重载操作符当然不是一个好的编程习惯,但C++语言不能承担任何事情。因此,不,不能也不会自动使用! ==组合代替!=! >组合代替<=

+0

你的'=='和'!='的例子很有意思。一个更现实的将是一个表示SQL对象的类,你必须处理'NULL'的特殊语义。 – dan04 2010-07-02 01:37:46

2

没有,你只需要重载operator ==和operator <,标准库将负责其余:)的

(编辑:看到使用空间std :: rel_ops;)

+0

不要认为这是如此......如果这是真的,为什么这个网页会给出定义例子!== = ==? http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html – 2010-02-06 23:01:23

+0

感谢您的澄清。 – 2010-02-06 23:03:20

+1

不,它不会,你必须明确定义每个运营商。 – 2010-02-06 23:05:07

0

有是几个shortcuts你可以使用,如CRTP,让他们automaticallyinjected(见各种比较类)到你的课堂。

+2

我想知道为什么这个和stakx现在被删除的答案都是倒票。 – GManNickG 2010-02-06 22:59:04

+0

打败了我,我很久以前就放弃了对代表的担心,但我仍然看到人们在玩游戏来试图影响答案。 – 2010-02-06 23:00:40

+2

请您解释原因时解释原因。 – 2010-02-06 23:30:20

7

Boost operators可能是你在找什么。这些将基于几个基本的运算符派生出大多数运算符。例如(虽然它通常是一个糟糕的主意),但是C++并没有自动提供这个意义,因为人们可以给<和>赋予完全不同的含义。

+1

C++确实将std :: rel_ops作为std :: rel_ops提供,但它很难正确使用,并且可能较短,只需键入它们即可(避免混淆)。 – 2010-02-06 23:06:55

0

是的!他们每个技术上不同的运营商。 C++编译器本身不是推理机,它们是解析器/编译器。他们只会按照你说的去做。 http://www.parashift.com/c++-faq-lite/operator-overloading.htmlhttp://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

+0

除了它们是推理机!看看ADL并找出函数重载解析规则,以避免很长的头痛。 – 2010-02-06 23:02:40

+0

我怀疑会有很多人工智能研究人员不同意你对计算机科学推理机的技术定义。但是,是的,现代编译器可以“弄清楚”的是令人印象深刻的。 – 2010-02-06 23:09:16

+0

我正在使用的定义:“推理引擎是一种有限状态机,由三项操作组成:匹配,选择和执行规则。”规则只是函数重载解析和程序中函数和类型的声明的组合。当然,没有理由认为它很原始。 – 2010-02-06 23:24:36

3

我打算在这里采取少数观点。如果你已经使用boost,那么使用boost操作符并不是什么大问题。它可能是正确和经过测试的做事方式,但仅为操作员添加增强依赖关系是一种矫枉过正。

它可以乱写升压复杂的C++程序(我个人认为美学不愉快)等保持简单(愚蠢),回答OP的问题,如果你超载operator ==,你也应该重载operator !=<,>,++

+2

如果你不喜欢助推,无论出于何种原因,这并不意味着你不能使用相同的技术。我的答案包含一个链接,指向一个单独的,自包含的头文件,我写为这种情况下如何做到这一点的例子。 – 2010-02-06 23:30:14

+0

我只是回答这个问题 - 当未定义'!='时,C++不会自动调用'operator =='并反转结果。不争议有一种自动化的方式来做到这一点。 – 2010-02-07 03:49:35

1

是的,有必要重载您希望在您定义它们时使用的任何操作符 - C++不会做出您在上面描述的决定;但是,请记住,如果重载的原因是对类进行排序,则只需重写排序例程使用的操作符。在RTL分类算法的情况下,您只需要覆盖<和=。

0

您可以使用重载来使用用户定义的名称。 运算符重载意味着使用相同的运算符对不属于该类别的不同项目执行操作。函数重载意味着使用相同的函数名但参数不同,以克服在循环过程中调用相同函数时的开销。

0

作为一种语言,C++没有根据任何其他重载操作符定义任何操作符。仅仅因为你有operator+,并不意味着你得到了operator+=免费(不像Ruby和Scala)。仅仅因为你有运营商<==并不意味着你可以免费获得<=。仅仅因为你有运营商==并不意味着你可以免费获得!=(与Ruby和Scala不同)。仅仅因为你有一元operator *(一元)并不意味着你可以免费获得operator ->

std::relops(如果正确输入),并提供默认的定义,并加速提供了一些混合,这些插件定义的<==方面都比较运营商。