有一些博文提到,c++中的默认拷贝构造函数都是浅拷贝,即是通过该函数拷贝的对象只复制了原对象的指针(https://blog.csdn.net/caoshangpa/article/details/79226270);但我在Qt上用以下代码测试时,得到如下结果:
#include <iostream>
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 ="<<&objecj1<<endl;
cout<<"address of objecj2 ="<<&objecj2<<endl;
cout<<"address of objecj3 ="<<&objecj3<<endl;
cout<<"address of objecj1_i ="<<&(objecj1.i)<<endl;
cout<<"address of objecj2_i ="<<&(objecj2.i)<<endl;
cout<<"address of objecj3_i ="<<&(objecj3.i)<<endl;
return 0;
}
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 <iostream>
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 ="<<&objecj1<<endl;
cout<<"address of objecj2 ="<<&objecj2<<endl;
cout<<"address of objecj3 ="<<&objecj3<<endl;
cout<<"value of objecj1_i ="<<(int)(objecj1.i)<<endl;
cout<<"value of objecj2_i ="<<(int)(objecj2.i)<<endl;
cout<<"value of objecj3_i ="<<(int)(objecj3.i)<<endl;
cout<<"address of objecj1_i ="<<&(objecj1.i)<<endl;
cout<<"address of objecj2_i ="<<&(objecj2.i)<<endl;
cout<<"address of objecj3_i ="<<&(objecj3.i)<<endl;
return 0;
}
结果如下:
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
就是说,调用默认拷贝构造函数时,会直接将对象中的值赋给新的对象中的对应变量。
因此,如果对象中有指针变量的话,默认构造函数会把两个对象中的该变量指向同一个地方。