文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++简明图解分析浅拷贝与深拷贝

2024-04-02 19:55

关注

类中有指针成员 才会讨论 浅拷贝 和深拷贝问题。

浅拷贝(单纯值拷贝)

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
    char *m_name;
public:
    Person(char *name)
    {
        cout<<"有参构造"<<endl;
        m_name = (char *)calloc(1,strlen(name)+1);
        if(m_name == NULL)
        {
            cout<<"空间申请失败"<<endl;
            exit(-1);
        }
        strcpy(m_name, name);
    }
    ~Person()
    {
        cout<<"析构函数"<<endl;
        //释放指针成员 指向的堆区空间
        if(m_name != NULL)
        {
            free(m_name);
            m_name = NULL;
        }
        cout<<"-----001------"<<endl;
    }
};
int main(int argc, char *argv[])
{
    Person ob1("lucy");
    Person ob2 = ob1;//拷贝构造(默认是浅拷贝)
    cout<<"ob2.m_name = "<<ob2.m_name<<endl;
    return 0;
}

深拷贝

必须在拷贝构造中给ob2.m_name申请空间

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
    char *m_name;
public:
    Person(char *name)
    {
        cout<<"有参构造"<<endl;
        m_name = (char *)calloc(1,strlen(name)+1);
        if(m_name == NULL)
        {
            cout<<"空间申请失败"<<endl;
            exit(-1);
        }
        strcpy(m_name, name);
    }
    Person(const Person &ob)
    {
        cout<<"拷贝构造函数(深拷贝)"<<endl;
        m_name = (char *)calloc(1, strlen(ob.m_name)+1);
        if(m_name == NULL)
        {
            cout<<"空间申请失败"<<endl;
            exit(-1);
        }
        strcpy(m_name, ob.m_name);
    }
    ~Person()
    {
        cout<<"析构函数"<<endl;
        //释放指针成员 指向的堆区空间
        if(m_name != NULL)
        {
            free(m_name);
            m_name = NULL;
        }
    }
};
int main(int argc, char *argv[])
{
    Person ob1("lucy");
    Person ob2 = ob1;//拷贝构造
    cout<<"ob2.m_name = "<<ob2.m_name<<endl;
    return 0;
}

总结

1、如果类中的成员 指向了堆区空间 一定要记得在析构函数中 释放该空间

2、如果用户 不实现 拷贝构造 系统就会提供默认拷贝构造,而默认拷贝构造 只是单纯的赋值 容易造成浅拷贝问题

3、用户记得 要实现:无参构造(初始化数据)、有参构造(赋参数)、拷贝构造(深拷贝) 、析构函数(释放空间)

拷贝构造函数的调用时机

拷贝构造函数调用的时机:旧对象 给新对象 初始化

class Data
{
public:
    Data()
    {
        cout<<"无参构造"<<endl;
    }
    Data(const Data &ob)
    {
        cout<<"拷贝构造"<<endl;
    }
    ~Data()
    {
        cout<<"析够函数"<<endl;
    }
};

情形1:旧对象给新对象初始化

Data ob1;
Data ob2 = ob1;//调用拷贝构造

情形2:普通对象作为函数的参数

void fun01(Data ob)//Data ob=ob1  发生拷贝构造
{
}
int main(int argc, char *argv[])
{
    Data ob1;
    fun01(ob1);
    return 0;
}

情形3:普通对象 作为函数的返回值

#include <iostream>
using namespace std;
Data fun01(void)
{
    Data ob1;
    return ob1;
}
int main(int argc, char *argv[])
{
    Data ob = fun01();
    return 0;
}

vs下会发生拷贝构造:

Qt、linux不会发生拷贝:

到此这篇关于C++简明图解分析浅拷贝与深拷贝的文章就介绍到这了,更多相关C++浅拷贝与深拷贝内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯