浅拷贝:简单的复制拷贝操作
浅拷贝带来的问题就是堆区的内容重复释放
深拷贝:在堆区重新申请空间
#include<iostream>
using namespace std;
class Person {
public:
Person() {
cout << "Person默认构造函数调用" << endl;
}
Person(int age,int height) {
cout << "Person有参构造函数调用" << endl;
m_Age = age;
m_Height=new int(height);//这个堆区数据需要由程序员手动开辟,也需要由程序员手动释放
}
/*Person(const Person &p) {
cout << "Person拷贝构造函数调用" << endl;
m_Age = p.m_Age;
};*///此处用编译器自动生成的拷贝函数
~Person() {
//析构,将堆区开辟数据做释放的操作
//终于发现析构函数的作用了(析构函数终于派上了用场)
if (m_Height != NULL)
delete m_Height;
m_Height = NULL;
cout << "Person析构函数调用" << endl;
};
int m_Age;
int *m_Height;//身高
};
//1.使用一个已经创建完毕的对象来初始化一个新对象
void test01() {
Person p1(20,168);
cout << "p1的年龄为:" << p1.m_Age << "身高为: " << *p1.m_Height << endl;
Person p2(p1);
//cout << "p1的年龄为:" << p1.m_Age <<"身高为: "<<*p1.m_Height<< endl;
cout << "p2的年龄为:" << p2.m_Age << "身高为: " <<*p2.m_Height << endl;
}
void dop(Person p) {
}
/*void test02() {
Person p;
dop(p);
}
Person dop2() {
Person p1;
return p1;
}
void test03() {
Person p = dop2();
}*/
int main() {
test01();
return 0;
}
原因当调用析构的时候,释放了两次,可是p1 p2 共用一个堆区
所以会造成堆区的内存重复释放,进而出了毛病
用深拷贝来解决这个问题—重新找一个堆区,不共用一个了
#include<iostream>
using namespace std;
class Person {
public:
Person() {
cout << "Person默认构造函数调用" << endl;
}
Person(int age,int height) {
cout << "Person有参构造函数调用" << endl;
m_Age = age;
m_Height=new int(height);//这个堆区数据需要由程序员手动开辟,也需要由程序员手动释放
}
//自己实现拷贝构造函数,解决浅拷贝带来的问题
Person(Person &p) {
m_Age = p.m_Age;
m_Height = new int(*p.m_Height);//开辟另一个空间来存储这个
//这里为什么是*,原因,你不加还是会报错的,因为这个拷贝构造函数的用了引用,引用的
//本质是转化为常量指针。而new后面那个括号里是初值,所以,只有加上*才是一个int型变量
//如果是编译器自动生成的话就会变成m_Height=p.m_Height;
}
~Person() {
//析构,将堆区开辟数据做释放的操作
//终于发现析构函数的作用了(析构函数终于派上了用场)
if (m_Height != NULL)
delete m_Height;
m_Height = NULL;
cout << "Person析构函数调用" << endl;
};
int m_Age;
int *m_Height;//身高
};
//1.使用一个已经创建完毕的对象来初始化一个新对象
void test01() {
Person p1(20,168);
cout << "p1的年龄为:" << p1.m_Age << "身高为: " << *p1.m_Height << endl;
Person p2(p1);
//cout << "p1的年龄为:" << p1.m_Age <<"身高为: "<<*p1.m_Height<< endl;
cout << "p2的年龄为:" << p2.m_Age << "身高为: " <<*p2.m_Height << endl;
}
void dop(Person p) {
}
/*void test02() {
Person p;
dop(p);
}
Person dop2() {
Person p1;
return p1;
}
void test03() {
Person p = dop2();
}*/
int main() {
test01();
return 0;
}