1

私はこれを経験していて、少し混乱しています。クラスを次のように宣言するとします。

class cls
{
public:
    int x;
    cls(int _x):x(_x){}
    cls& operator=(cls& ob)
    {
        x = ob.x;
        return *this;
    }
};

次に、2 つのオブジェクトを作成してコピー操作を実行し、代入演算子が次のようにオーバーロードされる前後の両方の変数のアドレスを出力します。

cls o1 = 7;
cls o2 = cls(8);
cout<<&o1<<endl;    //0330F880
cout<<&o2<<endl;    //0330F874
o1 = o2;
cout<<&o1<<endl;    //0330F880
cout<<&o2<<endl;    //0330F874

どちらのアドレス グループも同じです。これは、代入演算子が参照によって返されるためです。

しかし、代入演算子を値で返すように定義すると、同じアドレス グループ値が返されることに気付きました。

上記のリンクでは、値で返される場合、オブジェクトのコピーが返されると回答されています。次に、同じアドレス値を返すのはなぜですか。彼らは違うべきではありませんか。私の概念を明確にするのを手伝ってください。

4

2 に答える 2

5

戻り値は、何かを行う場合にのみ関連します。例えば:

(o1 = o2).do_something();

または同等:

(o1.operator=(o2)).do_something();

do_something()メソッドは、返されたオブジェクトで実行されます-あなたの場合は、参照を返していたのでの元のインスタンスですo1。ただし、代わりに値を返すようにコードを変更した場合は、 のコピーdo_something()実行されます。o1

3 番目のオブジェクトcls* o_ptr;があり、次の操作を行った場合:

cls o1 = 7;
cls o2 = cls(8);
cls* o_ptr = &(o1=o2);

表示した場合は、参照を返す場合o_ptrと同じですが、値を返す場合は異なります。&o1

于 2013-07-30T18:59:59.897 に答える
-1

メモリ内の場所ではなく、構造の内部コンテンツのみを上書きしているため、そのアドレスは同じだと思います。

于 2013-07-30T18:59:49.603 に答える