浅拷贝
再用一个对象初始化另一个对象的过程中 把对象的值赋给要初始化的对像 又称值传递
如果对象中有指针 会把一个指针付给另一个指针 两个指针指向同一 个空间 在析构回收内存时会出现同一个空间被释放两次的情况
#includeusing namespace std; class AA { public: int* p; public: AA() { p =new int(100); } ~AA() { delete p; p = nullptr; } }; //默认拷贝构造函数 浅拷贝 //浅拷贝 又称值拷贝 将一个变量的值赋给 要初始化的对象成员变量 //如果成员变量中有指针变量 就会造成空间释放两次的可能 int main() { AA a; cout << *a.p << endl; AA b=a; cout << *b.p << endl; //a先执行析构函数 把p赋null b的p 和 a的p 指向同一个在堆区开辟的空间 //b在执行析构时 p已经为null 不能再次释放p return 0; }
深拷贝
在拷贝的时候先去开辟一个和原对象成员指针变量指向空间大小一样的空间
将原对象成员指针变量所指向的空间里的值赋给新对象成员变量指针变量指向的空间
public:
int* p;
public:
AA()
{
p = new int(100);
}
AA(AA &ra)
{
p=new int(* ra.p);
}
~AA()
{
delete p;
p = nullptr;
}
也就是说
AA a;
AA b = a;
a b指向两块空间 两个空间存的值相同
释放时不会出现浅拷贝的情况
#includeusing namespace std; class AA { public: int* p; public: AA() { p = new int(100); } AA(AA &ra) { p=new int(* ra.p); } ~AA() { delete p; p = nullptr; } }; //深拷贝 在拷贝的时候先去开辟一个和原对象成员指针变量指向空间大小一样的空间 //将原对象成员指针变量所指向的空间里的值赋给新对象成员变量指针变量指向的空间 int main() { AA a; cout << *a.p << endl; AA b = a; AA c(a); cout << *b.p << endl; return 0; }
对象作为参数
void Show(AA a)
再主函数中
AA a;
Show(a);
实参向形参赋值的过程中 相当于把a实参赋给AA类型的形参a 相当于用一个对象初始化另一个对象 会执行拷贝构造 构造中会开辟空间 是深拷贝
完整代码如下
#includeusing namespace std; class AA { public: int* p; public: AA() { p = new int(100); } AA(AA& ra) { p = new int(*ra.p); } ~AA() { delete p; p = nullptr; } }; void Show(AA a) { cout << *a.p << endl; } //深拷贝 在拷贝的时候先去开辟一个和原对象成员指针变量指向空间大小一样的空间 //将原对象成员指针变量所指向的空间里的值赋给新对象成员变量指针变量指向的空间 int main() { AA a; Show(a); return 0; }



