c++コピー構造関数に関する疑問
1470 ワード
いくつかの博文では、c++のデフォルトのコピー構造関数は、その関数によってコピーされたオブジェクトが元のオブジェクトのポインタのみをコピーする浅いコピーであると述べています(https://blog.csdn.net/caoshangpa/article/details/79226270);しかし、Qtで以下のコードでテストしたところ、以下の結果が得られました.
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
明らかに新しい空間が作成されました.
後で少し修正して、私が浅いコピーの意味を理解し間違えたことに気づいて、修正後のコード:
結果は次のとおりです.
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つのオブジェクトの変数を同じ場所に指します.
#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つのオブジェクトの変数を同じ場所に指します.