#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;
}

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

posted on 2015-09-26 01:43  chifandeyu  阅读(128)  评论(0编辑  收藏  举报