【发布时间】:2012-10-05 06:01:29
【问题描述】:
据我所知,这里是重载后自增运算符的方法:
const MyClass& MyClass::operator++(int);
为什么它有 int 作为参数?
【问题讨论】:
-
来自this answer 一元递增和递减运算符有前缀和后缀两种风格。为了区分彼此,后缀变体采用额外的 dummy int 参数。
据我所知,这里是重载后自增运算符的方法:
const MyClass& MyClass::operator++(int);
为什么它有 int 作为参数?
【问题讨论】:
D&E,§11.5.3:
我考虑了显而易见的解决方案,将关键字
prefix和postfix添加到 C++ [ ... ] 但是,我收到了不喜欢新关键字的人们通常的愤怒嚎叫。提出了几个不涉及新关键字的备选方案。例如:
class Ptr_to_X { X ++operator(); // prefix ++ X operator++(); // postfix ++ };或
class Ptr_to_X { X& operator++(); // postfix because it // returns a reference x operator(); // prefix because it // doesn't return a reference };
我认为前者太可爱,后者太微妙。最后我决定了:
class Ptr_to_X { X operator++(); // prefix: no argument X operator++(int); // postfix: because of the argument };
这可能太可爱太微妙了,但它确实有效,不需要新的语法,并且有一个疯狂的逻辑。其他一元运算符是前缀并且在定义为成员函数时不带参数。 “奇数”和未使用的虚拟
int参数用于指示奇数后缀运算符。换句话说,在后缀的情况下,++位于第一个(实)操作数和第二个(虚拟)参数之间,因此是后缀。
这些解释是必要的,因为该机制是独一无二的,因此有点棘手。如果有选择,我可能会引入prefix和postfix关键字,但当时这似乎不可行。
【讨论】:
x++,这就是被调用的函数。如果你坚持叫它为x.operator++,那么我相信你必须传递一个参数(将被忽略):x.operator++(1);
这是为了区分前缀递增和后缀递增运算符。
为了完整起见,这在 C++03 和 C++11 标准的 §13.5.7 中都有规定。
【讨论】: