8

请考虑以下代码

#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);

它们的区别在于 & 标记,那么为什么需要虚拟参数?而且在这两种情况下,例如 ++ 运算符都写在参数之前,这不意味着它们是相同的吗?

4

4 回答 4

12

前后增量是两个不同的运算符,需要单独的重载。

C++ 不允许仅在返回类型上重载,因此在您的示例中具有不同的返回类型不足以消除这两种方法的歧义。

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

于 2011-10-12T12:54:21.337 回答
4

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

operator++()
operator++(int)

这是编译器区分两者的唯一方法。至于Digit&Digit返回值;需要它们是因为 ++x 和 x++ 应该运行的方式。

于 2011-10-12T13:00:19.383 回答
3

在 Pre-Increment/Decrement 和 Post-Increment/Decrement 中,差异仅基于重载函数中的虚拟参数

operator++()         => Prefix Increment
operator--()         => Prefix Decrement

operator++(int)      => Postfix Increment
operator--(int)      => Postfix Decrement

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

于 2016-02-24T06:28:52.493 回答
2

在 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#faq-13.14

于 2011-10-12T13:00:19.950 回答