标签:
#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)+1]; 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)+1]; 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 0; } //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; }
作为初学者,刚开始看时,看视频,然后抄抄代码,懵懵懂懂就过去了,然而再回过头来,温习最初的基础知识,才能深刻领悟其"之所以然".
标签:
原文地址:http://www.cnblogs.com/qq702368956/p/4839886.html