睡不着,复习一下C++基础中的基础(深拷贝与浅拷贝)

#include <iostream>
#include <string>
#include <assert.h>
using namespace std; //声明字符串拷贝函数
char* mystrcpy(char* str1,const char* str2); class CPerson
{
char* m_pName;
public:
CPerson(char* pName)
{
cout<<"普通构造函数"<<endl;
m_pName = new char[strlen(pName)+];
if(m_pName)
{
mystrcpy(m_pName, pName); }
} //拷贝构造函数,只做位模式拷贝,即浅拷贝
// CPerson(CPerson &p)
// {
// m_pName = p.m_pName;
// } //深拷贝 构造函数
CPerson(CPerson &p)
{
cout<<"深拷贝构造函数"<<endl;
m_pName = new char[strlen(p.m_pName)+];
if(m_pName)
{
mystrcpy(m_pName, p.m_pName);
}
}
~CPerson()
{
cout<<"析构函数"<<endl;
delete[] m_pName;
}
}; int main()
{
CPerson p1("Hello");
CPerson p2(p1);
//浅拷贝时,调用浅拷贝构造函数,p1.m_pName和p2.m_pName指针同时指向一个地址
//析构函数调用时,会两次删除m_pName指针,造成错误,
//所以要用深拷贝解决此问题
return ;
}
//mystrcpy的实现
char* mystrcpy(char* str1,const char* str2)
{
char* p = str1;
assert(str1 != NULL && str2 != NULL);
while(*str2)
{
*p = *str2;
p++;
str2++;
}
p = NULL;
return str1;
}

作为初学者,刚开始看时,看视频,然后抄抄代码,懵懵懂懂就过去了,然而再回过头来,温习最初的基础知识,才能深刻领悟其"之所以然".

上一篇:Git 安装和使用Tips


下一篇:java 日志体系(三)log4j从入门到详解