重载后缀和前缀操作符

overloading postfix and prefix operators

本文关键字:操作符 前缀 后缀 重载      更新时间:2023-10-16

请考虑以下代码

#include <iostream>
using namespace std;
class Digit
{
private:
    int m_digit;
public:
    Digit(int ndigit=0){
     m_digit=ndigit;
                        }
    Digit& operator++();//prefix
    Digit& operator--();   //prefix
        Digit operator++(int);
        Digit operator--(int);
        int get() const { return m_digit;}
};
Digit& Digit::operator++(){
   ++m_digit;
   return *this;
}
Digit& Digit::operator--(){
 --m_digit;
 return *this;
}
Digit Digit::operator++(int){
Digit cresult(m_digit);
++(*this);
return cresult;

}
    Digit Digit::operator--(int){
Digit cresult(m_digit);
--(*this);
return cresult;

}
    int main(){
     Digit cDigit(5);
      ++cDigit;
        cDigit++;
         cout<<cDigit.get()<<endl;
         cout<<cDigit.get()<<endl;


     return 0;
    }

在这里实现了后缀和前缀操作符的两个版本,我已经读到通过引入另一个所谓的假参数来实现差异,但我有疑问,如果我们看到这些

的声明
Digit& operator++();//prefix
             Digit& operator--();   //prefix
        Digit operator++(int);
        Digit operator--(int);

用&马克,为什么它是假论证?在这两种情况下,例如,++运算符写在参数之前,这是否意味着它们是相同的?

自增前操作符和自增后操作符是两个不同的操作符,需要分别重载。

c++不允许只在返回类型上重载,所以在你的例子中使用不同的返回类型并不足以消除这两个方法的歧义。

虚拟参数是c++设计者为消歧选择的机制。

在前递增/递减和后递增/递减中,差异仅基于重载函数

中的虚拟参数
operator++()         => Prefix Increment
operator--()         => Prefix Decrement
operator++(int)      => Postfix Increment
operator--(int)      => Postfix Decrement

返回类型可以相同。您也可以参考:http://www.tutorialspoint.com/cplusplus/increment_decrement_operators_overloading.htm

与任何函数一样,操作符由签名标识。函数/操作符名称之前的返回类型和修饰符不包括在其中。您的操作符名称在这里

operator++()
operator++(int)

这是编译器区分两者的唯一方法。对于Digit&Digit的返回值;它们是必需的,因为c++ x和x++的操作方式。

在c++中,函数/方法不能通过返回类型重载,只能通过参数列表重载。忽略前缀和后缀操作符都是操作符这一事实,想象一下,如果它们只是简单的其他函数,编译器如何根据返回类型确定使用哪个?例如

int x = 2;
const int DoIt()
{
    return 1;
}
int& DoIt()
{
    return x;
}
int y = DoIt();

由于操作符重载本质上只是函数,因此编译器无法通过返回类型来区分它们。

见http://www.parashift.com/c + + -faq-lite/operator-overloading.html #常见问题- 13.14