我正在使用成员函数重载++
前缀运算符。这是原型:
Test &operator++();
但是当我将它用于下面的对象时,我的疑问就出现了:
Test t;
++t;
据我所知,对于由成员函数重载的任何运算符,该运算符的左侧上应该存在同一类的对象。但是当我调用这个++
前缀重载运算符时,左侧不需要Test
类的任何对象。
为什么?
答案 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
确实在左侧。 :)