浅拷贝和深拷贝
浅拷贝:在调用拷贝构造函数的时候,新对象根据旧对象进行赋值,指针也一样,只是对新指针赋予旧对象指向的地址,而不为新指针创建新的空间(不注意的话将会遇到意想不到的问题)
深拷贝:在赋值的时候对于指针创建新的空间,将新的空间的值赋予旧空间的值(这需要我们自己动手为对象创建新的复制构造函数)
程序运行时会用到复制构造函数的时刻:
1). 一个对象以值传递的方式传入函数体
2). 一个对象以值传递的方式从函数返回
3). 一个对象需要通过另外一个对象进行初始化
复制构造函数的参数之所以使用引用类型是为了防止递归调用,因为值传递传参时将会调用复制构造函数
代码
#include<iostream>
using namespace std;
class ob
{
public:
int *a;
char *b;
ob() {}
//拷贝构造函数(复制构造函数) 深拷贝 将该函数注释(浅拷贝)就会出现不一样的结果
ob(const ob &B)
{
a = new int;
b = new char;
*a = *B.a;
*b = *B.b;
}
};
ob convert(ob B)
{
(*B.a)++;
*(B.b)='0';
return B;
}
int main()
{
ob B1;
int p = 2;
char q = 'a';
B1.a = &p;
B1.b = &q;
cout << *(B1.a) << " " << *(B1.b) << endl;
ob A1=B1;
p++;
q = 'b';
cout << *(B1.a) << " " << *(B1.b) << endl;
cout << *(A1.a) << " " << *(A1.b) << endl;
ob C1 = convert(B1);
cout << *(B1.a) << " " << *(B1.b) << endl;
cout << *(A1.a) << " " << *(A1.b) << endl;
cout << *(C1.a) << " " << *(C1.b) << endl;
}
结果
浅拷贝:对象全都指向相同的地址空间
深拷贝:对象之间指针指向的空间互不影响