0

次のコードがあります。

class  Array
{  
   public: 
       int aaa;
       Array():aaa(1){}
      void print()
      {
          cout << aaa << endl;
      }

      Array& operator++()
      {
          aaa++;
          return *this;
      }
      Array operator++(int)
      {
          Array a(*this);
          aaa++;
          return a;
      }
};

次のような質問があります。

  1. 接頭辞が参照を返し、接尾辞がオブジェクトを返すのはなぜですか? 本 C++ Primer では、著者は " For consistency with the built-in operators" のみを説明しました。

  2. 次に、コードをテストしました。

    配列ar;

        (ar++).print(); // print 1
    
        ar.print(); // print 2
    

出力はまさに私が期待したものです。ここで、オーバーロードの後置関数のコードを次のように変更しました。

Array operator++(int)
{
     Array a(*this);
     a.aaa++; // changed this
     return a;
}

テストコードを呼び出しました:

Array ar;
(ar++).print(); // this prints 2
ar.print(); // this prints 1

なぜ私はそのような結果を得たのですか?

4

2 に答える 2

3
  1. 後置演算子は、現在のオブジェクトの変更されていないバージョンを返す必要があるため、参照ではなくオブジェクトを返します。インクリメントが完了する前に値を返す必要があります。したがって、新しいオブジェクトを割り当てる必要があります。参照を返した場合、それは何への参照になりますか?

  2. 2 番目の例では、新しいオブジェクトを作成し、インクリメントして返しますが、演算子が適用された元のオブジェクトを変更していません。これは明らかに間違っているため、間違った結果が得られます。

于 2012-05-04T04:59:28.780 に答える
0

プレフィックス演算子とポストフィックス演算子はどちらも、呼び出されたオブジェクトを直感的に変更しているように見えますが、実際には異なる意味を持っています。プレフィックス演算子はオブジェクトを取得し、それにインクリメント操作を適用して、同じオブジェクトを返します。接尾辞演算子はオブジェクトを取得し、そのコピーを作成し、インクリメント演算子を元の演算子に適用して、コピーを返します。

このため、可能な場合は接尾辞演算子の使用を推奨しないさまざまなソースを目にしたことがあります。接尾辞コピーは一時オブジェクトを作成するため、接頭辞演算子よりも効率が悪い場合があります。多くの状態情報を維持する必要があるオブジェクトの場合、接尾辞演算子の使用にはコストがかかる可能性があります。

于 2012-05-04T05:03:42.103 に答える