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

标签 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 operator -() const;            // unary negation 

  // etc.
}; 

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

Fraction Fraction::operator -() const {   return (Fraction(-num, denom, 0)); } 

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

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

那么,对于一元运算符-,代码为

f3=-f1

按照上面对运算符+的想法,我认为代码应该像f3=f1-,等于f3=f1.operator- ()。为什么实际代码是f3=-f1而不是f3=f1-?我认为运算符前面的对象应该调用它......我在数学上知道它是f3=-f1,但是编译器如何识别代码f3=-f1 实际上是 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
};

Here's some history of how that came to be.随心所欲。

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

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

如果这让您感到不舒服,因为您习惯于看到“方法”总是出现在“对象之后”……那太糟糕了。有些语言的语法是有条理的和规则的……例如,使用所有前缀或所有后缀符号。但认知科学家和语言学家认为,有论点表明人类的思维是基于一种 language instinct 运作的。 ,而且我认为许多完全一致的语言与我们的思想“在我们的头脑中”创建结构的愿望作斗争。

无论哪种方式,正如@dyp 所说,所有这些运算符都来自 C(除了将 ! 编写为 not 的能力,我这样做,因为它符合标准并且更难错过)。如果您用前面的减号否定整数,然后用后面的减号否定一个复数类,那会很奇怪。

关于c++ - 是否所有运算符重载都将运算符放在将调用其重载的对象之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130988/

相关文章:

c++ - 在 Qt 4.8 中如何设置 "Qt::PreciseTimer"

c++ - Qt 5.6 测试版 Visual Studio 2015

c++ - 在 C++ 中使用 zeromq 将序列化的 Mat 对象发送到另一台计算机

swift - 为什么 Swift 中的运算符重载没有在它所属的类型中声明?

c++ - 为什么要为重载的 operator new 调用类构造函数?

c++ - 对具有相同参数签名的 operator[] 方法返回的 double 和 double 的引用

c++ - 使用重载的 >> 运算符调用 CPP 构造函数

c++ - 支持流附加的 zlib iostream 包装器

c++ - wxImage 并绘制原始 rgb 字节

c++ - ‘std::cin>> 中 ‘operator>>’ 的模糊重载 >>