【问题标题】:Why use int as an argument for post-increment operator overload?为什么使用 int 作为后增量运算符重载的参数?
【发布时间】:2012-10-05 06:01:29
【问题描述】:

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

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

为什么它有 int 作为参数?

【问题讨论】:

标签: c++ operator-overloading


【解决方案1】:

D&E,§11.5.3:

我考虑了显而易见的解决方案,将关键字 prefixpostfix 添加到 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 参数用于指示奇数后缀运算符。换句话说,在后缀的情况下,++ 位于第一个(实)操作数和第二个(虚拟)参数之间,因此是后缀。

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

【讨论】:

  • 谢谢你,我不再困惑了。怎么调用一个函数不传参数,但是同样的函数,签名有参数。
  • @NayanaAdassuriya:很简单:写x++,这就是被调用的函数。如果你坚持叫它为x.operator++,那么我相信你必须传递一个参数(将被忽略):x.operator++(1);
【解决方案2】:

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

为了完整起见,这在 C++03 和 C++11 标准的 §13.5.7 中都有规定。

【讨论】:

  • @NayanaAdassuriya 我相信这只是一个约定。
  • 感谢 juanchopanza:这是在 C++ 标准中提到的吗?
  • @NayanaAdassuriya, 名为 operator++ 的用户定义函数实现了前缀和后缀 ++ 运算符。如果这个函数是一个没有参数的成员函数,或者一个有一个类或枚举类型的参数的非成员函数,它会为该类型的对象定义前缀自增运算符 ++。如果该函数是具有一个参数(应为 int 类型)的成员函数或具有两个参数(第二个应为 int 类型)的非成员函数,则它为那个类型。它说参数是0。
  • @NayanaAdassuriya 请参阅第 13.5.7 节。
  • @chris:谢谢。所以你是调用一个没有参数的函数。但它的签名有一个参数。这是怎么回事?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
相关资源
最近更新 更多