睡不着,复习一下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)+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;
}

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

转载于:https://www.cnblogs.com/qq702368956/p/4839886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值