C++ 是否所有运算符重载都将运算符放在将调用重载的对象之后?

C++ 是否所有运算符重载都将运算符放在将调用重载的对象之后?,c++,operator-overloading,C++,Operator Overloading,我有一个关于一元运算符重载的问题。代码如下: 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

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

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.
}; 
Fraction Fraction::operator -() const {   return (Fraction(-num, denom, 0)); } 
对于一元运算符
-
,代码如下:

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.
}; 
Fraction Fraction::operator -() const {   return (Fraction(-num, denom, 0)); } 
假设我们有三个
Fraction
对象,
f1
f2
f3
。 我知道代码:

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

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

f3=-f1

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


非常感谢

只有两个一元运算符首先引用对象。这就是后缀
++
和后缀
--

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

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
};
你想怎么做就怎么做

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

  • 一元减(-)
  • 一元加号(+)
  • 一补(~)
  • 地址(&)
  • 指针取消引用(*)
  • 逻辑非(!或非)
如果它让你感到不舒服,因为你习惯于看到“方法”总是出现在“对象之后”…那太糟糕了。有些语言的语法是有条理和规则的……例如,使用所有前缀或后缀符号。但认知科学家和语言学家认为,有一些观点认为,人类的思维是在某种程度上运作的,我认为,许多纯粹一致的语言与我们的思维“在我们的头脑中”创造结构的愿望相抗争


不管怎样,正如@dyp所说,所有这些操作符都来自C(除了将
作为
而不是
编写的能力,我是这样做的,因为它在标准中,很难忽略)。如果你先用减号对整数求反,然后用减号对复数类求反,那会很奇怪。

因为语言(和数学)就是这样。@deviantfan,那么编译器怎么能识别它呢?编译器看到的是一个只有右手边操作数的
-
,所以它知道使用一元版本。不要相信下面的句子是真的:“我认为操作员面前的对象应该叫它……”。因为它不是。C++标准并没有说OP重载的每一个使用都应该有前面的对象。@ MattMcNabb如果非成员非朋友是可能的,那么它当然应该被使用。但通常情况下,它不是这样的,然后
friend
s不会像成员一样破坏封装。是的,您实际上需要键入额外的参数,否则该参数将是
指针,但我认为这一点更清楚。部分原因可能是我的Python经验。