8

据我所知,这是重载后增量运算符的方法:

const MyClass& MyClass::operator++(int);

为什么它有 int 作为参数?

4

2 回答 2

12

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的虚拟参数用于指示奇数后缀运算符。换句话说,在后缀的情况下,++位于第一个(实)操作数和第二个(虚拟)参数之间,因此是后缀。

这些解释是必要的,因为该机制是独一无二的,因此有点棘手。如果有选择,我可能会引入prefixandpostfix关键字,但当时这似乎不可行。

于 2012-10-05T06:19:17.913 回答
3

这是为了区分前缀增量和后缀增量运算符。

为了完整起见,这在 C++03 和 C++11 标准的第 13.5.7 节中进行了规定。

于 2012-10-05T06:02:11.580 回答