0
#include<iostream>
class A{
    public :
        int a;
};
int main(){
    A obj;
    obj.a = 5;
    A b(obj);

    b.a = 6;
    std::cout<<obj.a;
    return 0;

}

答えが5として返されるのはなぜですか。デフォルトでは、C++のコピーコンストラクターは浅いコピーを返します。浅いコピーは参照を意味しませんか?またはmi何かが足りない?

4

5 に答える 5

3

浅いコピーは参照を意味しますか?またはmi何かが足りない?

あなたは何かが欠けています。浅いコピーとはコピーを意味します。オブジェクトのすべてのメンバーを1つから別のメンバーにコピーします。参考ではありません。作成されたコピーは、オリジナルから完全に独立しています

浅いコピーと深いコピーの違いについては、この優れたチュートリアルを参照してください。

于 2013-01-26T16:23:10.367 に答える
2

浅いコピーは参照を意味しますか?またはmi何かが足りない?

はい、何かが足りません。

浅いコピーは参照を意味するものではありません。浅いコピーとは、メンバーをコピーすることを意味ます。メンバーがポインターの場合、ポインターが指しているコンテンツではなく、アドレスをコピーします。つまり、元のオブジェクトといわゆるコピーされたオブジェクトのポインタは、メモリ内の同じコンテンツを指します。それは浅いコピーと呼ばれます。一方、ディープコピーはアドレスをコピーせず、(新しいオブジェクト内に)新しいポインタを作成し、それにメモリを割り当ててから、元のポインタが指すコンテンツをコピーします。

あなたの場合、クラスにポインタメンバーがないため、浅いコピーと深いコピーは違いがありません。すべてのメンバーは(通常どおり)コピーされます。また、ポインターであるメンバーはないため、コピーされた各メンバーはメモリ内の異なるメンバーです。つまり、元のオブジェクトとコピーされたオブジェクトは、メモリ内の完全に異なるオブジェクトです。2つのオブジェクトが互いに共有するものはまったくありません。したがって、一方を変更しても、もう一方はまったく変更されません。

于 2013-01-26T16:25:26.307 に答える
2

bとは完全に別のオブジェクトですobj。には独立した独自aのがありobjます。

あなたが念頭に置いているのはリファレンスのようです:

A& b = obj;

この後、両方bobj同じオブジェクトを参照します。を介して行われた変更は、を介してb表示されobj、その逆も同様です。

于 2013-01-26T16:20:54.630 に答える
0

はい、デフォルトのコピーコンストラクターはシャローコピーです。詳細はこちら

ただし、bはaと完全に互いに素であるため、2つのことは直接関係していません。

于 2013-01-26T16:20:27.090 に答える
0

A b(obj)obj新しく作成されたオブジェクトに情報をコピーしますb。はい、それは浅いコピーなので、b実際に割り当てられているものを制御しません。あなたがおそらく考えているのはリファレンスです:

A& b = obj;

b.a = 6;

std::cout << obj.a; // 6
于 2013-01-26T16:22:41.407 に答える