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经验。