一、拷贝构造
1、什么是拷贝构造函数?
构造函数->参数是当前这个类的一个const类型的引用
2、拷贝构造是干什么用的?
复制一个对象
3、需要注意什么问题?
类中默认的拷贝构造是一个浅拷贝,浅拷贝会使两个指针使用同一个空间,在析构里删除被释放两次。
4、怎么解决上个问题?
使用深拷贝,或者选择指针,引用。不存在对象间复制的过程,也就没有拷贝了。
#include <iostream>
using namespace std;
class CPerson
{
public:
int *m_nAge;
public:
CPerson()
{
m_nAge = new int(0);
}
拷贝构造函数 构造函数->参数是当前这个类的一个const类型的引用
//CPerson(const CPerson& pp) // 默认的 是浅拷贝 复制了成员变量
//{
// this->m_nAge = pp.m_nAge;
//}
//CPerson(const CPerson& pp) //深拷贝 复制了成员变量及其生成的空间
//{
// this->m_nAge = new int;
// *(this->m_nAge) = *(pp.m_nAge);
//}
~CPerson()
{
delete m_nAge;
m_nAge = 0;
}
};
void QQ(CPerson ps1) //不用深拷贝的话,也可以使用引用,如void QQ (CPerson& ps1)
{
}
int main()
{
/*CPerson ps;
CPerson ps1(ps);*/
CPerson ps;
QQ(ps);
system("pause");
return 0;
}
画个图帮助理解吧:
浅拷贝:两个指针共用一个空间,在析构里删除被释放两次,系统报错
深拷贝:两个指针有各自的空间,克服了浅拷贝出现的问题
浅拷贝只复制了成员变量,空间共用
深拷贝:同时复制了成员变量及其生成的空间
二、operator=
#include <iostream>
using namespace std;
//空类中默认的函数:默认无参的构造,析构,拷贝构造,operator=
//拷贝构造,operator= 这两个默认的都是浅拷贝
//拷贝构造是创建对象的时候执行,operator= 对象的重新赋值
class CPerson
{
public:
int *m_nAge;
public:
CPerson()
{
m_nAge = new int(0);
}
~CPerson()
{
delete m_nAge;
m_nAge = 0;
}
public:
//CPerson& operator=(const CPerson& pp)//浅拷贝
//{
// this->m_nAge = pp.m_nAge;
// return *this;
//}
CPerson& operator=(const CPerson& pp) //深拷贝
{
//删除原有的空间
delete this->m_nAge;
//重新分配
this->m_nAge = new int;
*(this->m_nAge) = *(pp.m_nAge);
return *this;
}
};
int main()
{
CPerson ps;
CPerson ps1;
ps1 = ps;
system("pause");
return 0;
}
详见视频12-14