3

これによると:演算子のオーバーロード

class X {
  X& operator++()
  {
    // do actual increment
    return *this;
  }
  X operator++(int)
  {
    X tmp(*this);
    operator++();
    return tmp;
  }
};

++演算子を実装する方法です。2 つ目 (後置演算子) は、参照ではなく値で戻ります。ローカル オブジェクトへの参照を返すことができないため、これは明らかです。したがって、tmpオブジェクトをスタック上に作成する代わりに、ヒープ上に作成し、それへの参照を返します。したがって、余分なコピーを避けることができます。だから私の質問は、次のことに問題はありますか?

class X {
  X& operator++()
  {
    // do actual increment
    return *this;
  }
  X& operator++(int)
  {
    X* tmp = new X(*this);
    operator++();
    return *tmp;
  }
};
4

3 に答える 3

4

呼び出し元は、メモリの削除に対処する必要があります。

于 2013-06-15T08:50:34.720 に答える
1

余分なコピーを避けたい場合は、おそらく余分なコピーがないことに注意してください。RVOはそれを回避します - 戻り値は呼び出し側の変数 X に直接入れられ、コピーを最適化します。

于 2013-06-15T09:23:55.777 に答える