前缀运算符重载

时间:2011-09-01 22:38:40

标签: c++ operator-overloading

我正在使用成员函数重载++前缀运算符。这是原型:

Test &operator++();

但是当我将它用于下面的对象时,我的疑问就出现了:

Test t;
++t;

据我所知,对于由成员函数重载的任何运算符,该运算符的左侧上应该存在同一类的对象。但是当我调用这个++前缀重载运算符时,左侧不需要Test类的任何对象。

为什么?

5 个答案:

答案 0 :(得分:3)

Test& operator++();

始终是C ++标准的前缀运算符。

要覆盖后缀运算符,您需要使用另一个签名:

Test& operator++(int);

这些签名是编译器已知的,它将正确地覆盖正确的运算符。

答案 1 :(得分:2)

你刚学错了。你怎么能在一元前缀运算符的左边有东西?

operator~operator--operator!也是如此。你左边没有任何东西。

答案 2 :(得分:2)

然后你学会了错误......

你的榜样很好;这确实是如何为预增量运算符声明一个重载。

答案 3 :(得分:1)

运算符重载提供的语法与任何其他成员(或非成员)函数略有不同。无论是将预增量实现为成员函数还是实现自由函数,都要实现预增量,预增量的语法为++obj

答案 4 :(得分:1)

  

据我所知,对于任何由成员函数重载的运算符,该运算符左侧应该有一个相同类的对象。

这适用于任何二进制运算符。增量前和后增量以及解除引用运算符(*obj)是一元运算符。它们有一个参数(函数参数或隐含的“this”参数,具体取决于如何重载运算符),对于重载运算符,这个参数必须是类类型。

  

但是当我调用这个++前缀重载运算符时,我不需要在左侧使用Test类的任何对象。

一元运算符没有“左”和“右”边(操作数),它们只有一个操作数。


请记住,在您的情况下:

++t;

仅表示:

t.operator++();

所以 - 在一些扭曲的思维中 - t确实在左侧。 :)