2

次のコードがあります。

class Sales_item {
     public:
     int ii;
         Sales_item& operator=(const Sales_item &item)
     {
        cout << "Inside assignment\n"; // Line 1
        ii = item.ii;
        return *this; // Line 2
     }
};

次に、私はしました:(ほんの一例)

Sales_item s;
Sales_item s1 = s;

しかし、Line 1実行しませんでした。オーバーロードされた割り当て内のコードを「見て」実行するにはどうすればよいですか? たとえば、複雑なコードがあり、デバッグしたいですか? 行 1 にブレークポイントを設定しようとしましたが、プログラムはそのブレークポイントにジャンプしませんでした。

なぜLine 2返品するの*thisですか?に変更しようとしましvoidたが、同じ結果が得られました。違いは何ですか?

4

2 に答える 2

5

s1割り当てではなく、初期化しています。

Sales_item s1 = s;

コンパイラによって生成されたコピー コンストラクターを呼び出します。これは以下と同等です:

Sales_item s1(s);

必要なもの:

Sales_item s1;
s1 = s;

なぜLine 2返品するの*thisですか?- これは代入演算子を実装する慣用的な方法であり、それに固執することをお勧めします。メソッドと操作の連鎖を容易にします。

于 2012-05-03T13:57:34.533 に答える
1

質問 2 について: s1 = s2 = s3 = ... のような連鎖代入を有効にするために *this を返します。

于 2012-05-03T13:59:59.553 に答える