我有一个关于一元运算符重载的问题。代码如下:
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.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/