浅拷贝:简单的赋值拷贝操作,可能使两对象在释放堆区内存时,重复释放,编译器报错
深拷贝:在堆区重新创建一块新内存
#include "stdafx.h"
#include<iostream>
using namespace std;
//深拷贝与浅拷贝
//浅拷贝:简单的赋值拷贝操作,可能使两对象在释放堆区内存时,重复释放,编译器报错
//深拷贝:再堆区重新创建一块新内存
//浅拷贝带来的问题:内存重复释放,编译器报错,用深拷贝解决
class Person
{
public:
Person()
{
cout << "Person的默认构造函数调用" << endl;
}
Person(int age, int height)
{
m_age = age;
m_height = new int(height);
cout << "Person的有参构造函数调用" << endl;
}
//写个拷贝构造函数,解决浅拷贝内存重复调用问题
Person(const Person &p)
{
cout << "Person拷贝函数调用" << endl;
m_age = p.m_age;
//m_height = p.m_height;//编译器默认实现这行代码
//深拷贝操作;
m_height = new int(*p.m_height);
}
~Person()
{
//析构代码,将堆区开辟的数据做释放操作
/*
if (m_height != NULL) //p1和p2均会调用这行代码,由于局部变量存放在栈区,遵从先进后出原则,故p2先调用这行代码,p2执行了之后,变量内存即释放,内存地址不存在,p1再次调用时,内存重复释放,编译器就会报错
{
delete m_height;
m_height = NULL;
}
*/
cout << "Person的析构函数调用" << endl;
}
int m_age;//年龄
int *m_height;//身高数据创建在堆区;
};
void test()
{
Person p1(10,160);
cout << "p1的年龄:" << p1.m_age << "身高为:" << *p1.m_height << endl;
Person p2(p1);
cout << "p2的年龄:" << p2.m_age << "身高为:" << *p2.m_height << endl;
}
int main()
{
test();
system("pause");
return 0;
}
//总结:若属性有在堆区开辟的,一定要提供拷贝构造函数,防止浅拷贝带来的问题