我有一个关于一元运算符重载的问题。代码如下:
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),即运算符前面的对象将调用运算符,后面的对象将作为参数传递,对吧?
然后,对于一元运算符-,代码是
f3=-f1
遵循上面运算符+的思想,我认为代码应该类似于f3=f1-,它等同于f3=f1.operator-()。为什么实际的代码是f3=-f1而不是f3=f1-?我认为操作符前面的对象应该调用它。我在数学上知道,它是f3=-f1,但是编译器如何识别代码f3=-f1,它实际上是f1调用的运算符?它如何知道在这种情况下,-是一元运算符?
非常感谢!
发布于 2014-10-01 08:09:52
只有两个一元运算符,其中对对象的引用位于第一位。这是后缀++和后缀--。
在重载中如何区分它们的语法有点奇怪。您添加了一个假参数:
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.可以随心所欲地处理它。
除了这些后缀形式之外,所有其他的一元运算符都出现在对象引用之前。这包括:
如果因为习惯于看到“方法”总是出现在“对象”之后而让你感到不舒服,那就太糟糕了。一些语言的语法是有条理的,例如,regular...using all prefix或all postfix notation。但认知科学家和语言学家认为,有观点认为,人类的大脑运行在一种language instinct上,我认为许多纯粹一致的语言与我们的大脑在“我们的大脑”中创造这种结构的愿望相抗衡。
无论哪种方式,正如@dyp所说,所有这些运算符都来自C(除了将!编写为not的能力,我就是这样做的,因为它在标准中,很难遗漏)。如果你在front...and中用负号对整数求反,然后用后面的负号对一个复数类求反,那会很奇怪。
https://stackoverflow.com/questions/26130988
复制相似问题