c++コピー構造関数に関する疑問

1470 ワード

いくつかの博文では、c++のデフォルトのコピー構造関数は、その関数によってコピーされたオブジェクトが元のオブジェクトのポインタのみをコピーする浅いコピーであると述べています(https://blog.csdn.net/caoshangpa/article/details/79226270);しかし、Qtで以下のコードでテストしたところ、以下の結果が得られました.
#include 

class a{
public:
    int i;
//    a(){
//        i = 1;
//    }
};

using namespace std;

int main(int argc, char *argv[])
{
    a objecj1;
    a objecj2 = objecj1;
    a objecj3(objecj1);
    cout<

 
address of objecj1 =0x61fe9c
address of objecj2 =0x61fe98
address of objecj3 =0x61fe94
address of objecj1_i =0x61fe9c
address of objecj2_i =0x61fe98
address of objecj3_i =0x61fe94
 
明らかに新しい空間が作成されました.
後で少し修正して、私が浅いコピーの意味を理解し間違えたことに気づいて、修正後のコード:
#include 

class a{
public:
    int* i;
    a(){
        i = new int;
    }
};

using namespace std;

int main(int argc, char *argv[])
{
    a objecj1;
    a objecj2 = objecj1;
    a objecj3(objecj1);
    cout<

結果は次のとおりです.
address of objecj1 =0x61fe9c
address of objecj2 =0x61fe98
address of objecj3 =0x61fe94
value of objecj1_i =791976
value of objecj2_i =791976
value of objecj3_i =791976
address of objecj1_i =0x61fe9c
address of objecj2_i =0x61fe98
address of objecj3_i =0x61fe94
 
つまり、デフォルトのコピーコンストラクション関数を呼び出すと、オブジェクトの値が新しいオブジェクトの対応する変数に直接割り当てられます.
したがって、オブジェクトにポインタ変数がある場合、デフォルトのコンストラクション関数は、2つのオブジェクトの変数を同じ場所に指します.