gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:40:06 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com