首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否所有操作符重载都将操作符放在其重载将被调用的对象之后?

是否所有操作符重载都将操作符放在其重载将被调用的对象之后?
EN

Stack Overflow用户
提问于 2014-10-01 06:11:09
回答 1查看 131关注 0票数 0

我有一个关于一元运算符重载的问题。代码如下:

代码语言:javascript
复制
class Fraction { 
 public: 
   Fraction() {} 
   Fraction(int a); 
   Fraction(int n, int d, int reduce=1); 
   Fraction operator +(const Fraction& y) const; 
   Fraction operator -(const Fraction& y) const;
   Fraction operator -() const;            // unary negation 

  // etc.
}; 

对于一元运算符-,代码如下:

代码语言:javascript
复制
Fraction Fraction::operator -() const {   return (Fraction(-num, denom, 0)); } 

假设我们有三个Fraction对象,f1f2f3。我知道代码:

f3=f1+f2等于f3=f1.operator+(f2),即运算符前面的对象将调用运算符,后面的对象将作为参数传递,对吧?

然后,对于一元运算符-,代码是

f3=-f1

遵循上面运算符+的思想,我认为代码应该类似于f3=f1-,它等同于f3=f1.operator-()。为什么实际的代码是f3=-f1而不是f3=f1-?我认为操作符前面的对象应该调用它。我在数学上知道,它是f3=-f1,但是编译器如何识别代码f3=-f1,它实际上是f1调用的运算符?它如何知道在这种情况下,-是一元运算符?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2014-10-01 08:09:52

只有两个一元运算符,其中对对象的引用位于第一位。这是后缀++和后缀--

在重载中如何区分它们的语法有点奇怪。您添加了一个假参数:

代码语言:javascript
复制
class Ptr_to_X {
    // ...
    X operator++();      //prefix: no argument
    X& operator++(int);  //postfix: because of
                         //the argument

    X operator--();      //prefix: no argument
    X& operator--(int);  //postfix: because of
                         //the argument
};

Here's some history of how that came to be.可以随心所欲地处理它。

除了这些后缀形式之外,所有其他的一元运算符都出现在对象引用之前。这包括:

  • 一元减(-)
  • 一元加(+)
  • 1补码(~)
  • 地址(&)
  • 指针取消引用(*)
  • 逻辑非(!或者不是)

如果因为习惯于看到“方法”总是出现在“对象”之后而让你感到不舒服,那就太糟糕了。一些语言的语法是有条理的,例如,regular...using all prefix或all postfix notation。但认知科学家和语言学家认为,有观点认为,人类的大脑运行在一种language instinct上,我认为许多纯粹一致的语言与我们的大脑在“我们的大脑”中创造这种结构的愿望相抗衡。

无论哪种方式,正如@dyp所说,所有这些运算符都来自C(除了将!编写为not的能力,我就是这样做的,因为它在标准中,很难遗漏)。如果你在front...and中用负号对整数求反,然后用后面的负号对一个复数类求反,那会很奇怪。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26130988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档