重载 ++ 运算符

5

我第一次尝试处理运算符重载,我编写了以下代码来重载++操作符,以使类变量 i x增加1。它的确完成了任务,但是编译器显示了以下警告:

警告 1:在类型“tclass”中找不到“operator ++”的后缀形式,使用前缀形式 c:\users\ahmed\desktop\cppq\cppq\cppq.cpp 25

警告 2:在类型“tclass”中找不到“operator ++”的后缀形式,使用前缀形式 c:\users\ahmed\desktop\cppq\cppq\cppq.cpp 26

这是我的代码:

class tclass{
public:
    int i,x;
    tclass(int dd,int d){
        i=dd;
        x=d;
    }
    tclass operator++(){

        i++;
        x++;
        return *this;

    }
};

int main() {
    tclass rr(3,3);
    rr++;
    rr++;
    cout<<rr.x<<" "<<rr.i<<endl;
    system("pause");
    return 0;
}
3个回答

12

这个语法:

tclass operator++()

++前缀操作符(通常写作tclass &operator++())用于自增。为了区分后缀自增,需要添加一个未使用的int参数。

tclass operator++(int)

还需要注意的是,前缀增量运算符最好返回tclass &,因为结果可能在之后被使用:(++rr).x

同样需要注意的是,后缀增量运算符的形式如下:

tclass operator++(int)
{
    tclass temp = *this;
    ++*this;     // calls prefix operator ++
                 // or alternatively ::operator++(); it ++*this weirds you out!!
    return temp;
}

3
“++*this;”让我感到奇怪。我使用“::operator++();”。这让其他人感到奇怪。 - Mooing Duck
++*this; 显示错误,提示:错误 1 错误 C2675: 一元 '++' : 'tclass' 未定义此运算符或可预定义运算符的类型转换 c:\users\ahmed\desktop\cppq\cppq\cppq.cpp 14 - Aan
@Shahbaz:我正在使用MS VC++。 - Aan
微软的Visual C++是最不符合标准的编译器之一(特别是6版本,它是在C++成为标准之前编写的)。个人建议使用真正的编译器进行编码。如果你被迫使用它,你需要参考MSDN来了解它的缺陷和解决方法。无论如何,我所写的方式是标准的。 - Shahbaz
1
@Shahbaz:MSVC绝对是一个真正的编译器。 MSVC6在2002年被替换。这大致相当于GCC 3.0.4。更有可能是他做错了什么。不相关的:operator++()的返回类型通常是tclass& - Mooing Duck

6

两个++运算符。你定义了一个并使用了另一个。

tclass& operator++(); //prototype for    ++r;
tclass operator++(int); //prototype for  r++;

5
存在后置自增和前置自增的重载版本。后置自增版本的签名为operator++(int),而前置自增的签名为operator++()
您定义了operator++(),因此只定义了前置自增。但是,您在类的实例上使用了后置自增,所以编译器告诉您将使用对前置自增函数的调用,因为未定义后置自增。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接