zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    Linux常用指令全集
    js判断ie11浏览器
    javascript事件触发器fireEvent和dispatchEvent
    HTML5自定义属性对象Dataset简介
    CommonJS规范
    sql基本语法大全
    (七)make menuconfig
    (六)buildroot使用详解
    (二十一)Makefile例子
    (二十)ubuntu的recovery mode解决用户一些实际问题
  • 原文地址:https://www.cnblogs.com/qq702368956/p/4839886.html
Copyright © 2011-2022 走看看