深浅拷贝是面试经典问题,也是常见的一个坑
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
#include<iostream>
using namespace std;
class Person
{
public:
Person()//默认构造函数
{
cout << "默认构造函数的调用" << endl;
}
Person(int a,int heght )//有参构造函数
{
age = a;
m_height = new int(heght);
cout << "有参构造函数的调用" << endl;
}
//2、自己提供拷贝构造函数
Person(const Person &p)
{
cout << "拷贝构造函数的调用" << endl;
age = p.age;
//m_height = p.m_height; 编译器自动提供的浅拷贝
m_height = new int(*p.m_height);//深拷贝,在堆区申请内存,即又复制了一块内存,不会造成内存重复释放
}
~Person()//1、如果不自己写拷贝构造函数,会调用编译器提供的拷贝构造,只是简单赋值,会导致重复释放两次内存
{
cout << "析构函数的调用" << endl;
if (m_height != NULL)
{
delete m_height;
m_height = NULL;
}
}
public:
int age;
int* m_height;
};
void main()
{
Person P1(18,175);
cout << "P1的年龄:" << P1.age <<" P1的身高"<< *P1.m_height << endl;
Person P2(P1);
cout << "P2的年龄:" << P2.age << " P2的身高" << *P2.m_height << endl;
}