【问题标题】:C++ increment operatorC++ 增量运算符
【发布时间】:2011-02-16 04:03:40
【问题描述】:

如何区分运算符++的2个版本的重载?

const T& operator ++(const T& rhs)

哪一个?

i++;
++i;

【问题讨论】:

  • 你的 C++ 教科书对这个主题有什么看法?

标签: c++ class templates struct operator-overloading


【解决方案1】:

对于非成员版本,具有一个参数的函数是前缀,而具有两个参数且第二个为int的函数是后缀:

struct X {};
X& operator++(X&);      // prefix
X  operator++(X&, int); // postfix

对于成员版本,零参数版本为前缀,一参数版本以int为后缀:

struct X {
    X& operator++();    // prefix
    X  operator++(int); // postfix
};

用于调用后缀运算符的int 参数的值为零。

【讨论】:

  • @gf 添加一个例子,这将是最好的答案
【解决方案2】:

这些运算符是一元的,即它们不带右侧参数。

至于你的问题,如果你真的必须重载这些运算符,对于前增量使用签名const T& operator ++(),对于后增量,const T& operator(int)。 int 参数是一个虚拟参数。

【讨论】:

  • 它们可以是非成员函数。
  • @gf 是的。但这不是我对增量运​​算符的首选。 (无论如何,我的第一选择是不要重载运算符。)
  • @Daniel:如果你想编写一个 C++ 的迭代器或类似迭代器的对象,你别无选择。
  • @Zan: ...除非您使用 boost.iterator 来帮助您;)
  • @Zan,这对我来说是新的。如果您想将op++ 添加到您的迭代器中,为什么需要非成员?
【解决方案3】:

对于后缀 ++ 和 -- 运算符,该函数必须采用虚拟 int 参数。如果它没有参数,那么它是前缀运算符

【讨论】:

    【解决方案4】:

    将后缀增量i++ 视为具有第二个(缺失)参数(即i++x)。所以后缀增量签名有一个右手参数,而前缀增量没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多