返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++深浅拷贝及简易string类怎么实现
  • 414
分享到

C++深浅拷贝及简易string类怎么实现

2023-07-05 02:07:07 414人浏览 安东尼
摘要

这篇“c++深浅拷贝及简易string类怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++深浅拷贝及简易strin

这篇“c++深浅拷贝及简易string类怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++深浅拷贝及简易string类怎么实现”文章吧。

    三种拷贝方式

    浅拷贝

    对于自定义的string类,如果不显式定义拷贝构造函数,编译器会默认生成拷贝构造函数,此时的拷贝方式是浅拷贝,两个对象会公用一块儿内存,析构时同一空间被释放两次,会导致程序崩溃。

    C++深浅拷贝及简易string类怎么实现

    赋值运算符重载也会产生同样的问题,同时,由于被赋值对象原来有空间,浅拷贝还会导致旧的空间无法找到,造成内存泄漏。

    深拷贝

    类中设计到资源的管理,拷贝构造函数、赋值运算符重载以及析构函数都要显示给出,按照深拷贝的方式。

    深拷贝的方式让每个对象都独立拥有一份资源,不会造成多次释放导致程序崩溃的问题。

    C++深浅拷贝及简易string类怎么实现

    写时拷贝

    写时拷贝是通过浅拷贝+引用计数的方式来实现的,引用计数是用来记录资源的被引用的次数,

    C++深浅拷贝及简易string类怎么实现

    C++深浅拷贝及简易string类怎么实现

    可以将这种写时拷贝的机制想象成“拖延症”,只有当不得不进行拷贝时,才会开辟新空间进行拷贝

    VS与GCC中的拷贝方式

    windows VS2022

    VS中采用的是深拷贝的方式

    C++深浅拷贝及简易string类怎么实现

    linux GCC

    GCC编译器采用的是写时拷贝的方式

    C++深浅拷贝及简易string类怎么实现

    简易string类

    简易string类主要实现四个功能,即构造函数、拷贝构造函数、析构函数、赋值运算符重载,主要考察深浅拷贝

    实现简易string类有两种代码风格,一种传统版写法,代码复用性第,可读性较好;另一种称为现代版写法,代码复用性高,但是较难理解。

    传统版写法的string类

    构造函数

    步骤:

    • 判断是否为空指针,string类不允许nullptr构造对象

    • 申请新空间

    • 字符串中的值拷贝到申请的空间

    string(const char* str = ""){if (nullptr == str){assert(false);return;}//+1是因为有'\0',strcpy会将源字符串中的'\0'拷贝到目标空间_str = new char[strlen(str) + 1];strcpy(_str, str);}

    拷贝构造函数

    步骤:

    • 开辟空间

    • 用源对象的_str给当前对象的_str赋值

    string(const string& s):_str(new char[strlen(s._str) + 1]){strcpy(_str, s._str);}

    赋值运算符重载

    步骤:

    • 判断是否自己给自己赋值

    • 开辟新空间

    • 拷贝元素

    • 删除旧空间

    string& operator=(const string& s){//避免自己给自己赋值if (this != &s){char* temp = new char[strlen(s._str) + 1];strcpy(temp, s._str);delete[] _str;_str = temp;}return *this;}

    另一种写法

    C++深浅拷贝及简易string类怎么实现

    这种写法不用定义临时变量,代码相对简洁一点,但是如果new申请空间失败,旧的空间也无法找到。

    析构函数

    步骤:

    • 释放空间

    • 将指针置为空

    ~string(){    if (_str)    {        delete[]_str;        _str = nullptr;    }}

    现代版写法string类

    构造函数

    string(const char* str = ""){if (str == nullptr){assert(false);}_str = new char[strlen(str) + 1];strcpy(_str, str);}

    拷贝构造函数

    拷贝构造函数中利用构造函数,实现了代码的复用

    步骤:

    • 在初始化列表中将_str置为空

    • 定义一个临时的string类对象,指向要拷贝的对象相同位置

    • 交换临时对象与当前对象的_str

    string(const string& s):_str(nullptr){//调用构造函数string temp(s._str);//交换以后temp指向空,函数退出后被销毁swap(_str, temp._str);}

    C++深浅拷贝及简易string类怎么实现

    赋值运算符重载函数

    步骤:

    • 判断是否为自己给自己赋值

    • 调用拷贝构造函数定义临时变量

    • 交换临时变量与当前对象的_str

    string& operator=(string& s){if (this != &s){string temp(s);swap(_str, s._str);}return *this;}

    更简洁的写法:

    string& operator=(string s){//传参调用拷贝构造函数,不用判断是否给自己赋值swap(_str, s._str);return *this;}

    析构函数

    ~string(){if (_str){delete[] _str;_str = nullptr;}}

    以上就是关于“C++深浅拷贝及简易string类怎么实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网其他教程频道。

    --结束END--

    本文标题: C++深浅拷贝及简易string类怎么实现

    本文链接: https://lsjlt.com/news/349093.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • C++深浅拷贝及简易string类怎么实现
      这篇“C++深浅拷贝及简易string类怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++深浅拷贝及简易strin...
      99+
      2023-07-05
    • C++深浅拷贝及简易string类实现方式
      目录三种拷贝方式浅拷贝深拷贝写时拷贝VS与GCC中的拷贝方式Windows VS2022Linux GCC简易string类传统版写法的string类现代版写法string类总结三种...
      99+
      2023-02-05
      C++深浅拷贝 C++实现string类 C++ string类
    • JS怎么实现深拷贝和浅拷贝
      这篇文章主要介绍“JS怎么实现深拷贝和浅拷贝”,在日常操作中,相信很多人在JS怎么实现深拷贝和浅拷贝问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS怎么实现深拷贝和浅拷贝”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-30
    • Java的深拷贝和浅拷贝怎么实现
      这篇文章主要介绍“Java的深拷贝和浅拷贝怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java的深拷贝和浅拷贝怎么实现”文章能帮助大家解决问题。关于Java的深拷贝和浅拷贝,简单来说就是创...
      99+
      2023-06-26
    • javascript中怎么区分浅拷贝和深拷贝并实现深拷贝
      这篇文章将为大家详细讲解有关javascript中怎么区分浅拷贝和深拷贝并实现深拷贝,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是拷贝 一个东西的拷贝看起来像是原来...
      99+
      2024-04-02
    • C++深浅拷贝和string类的写法有哪些
      小编给大家分享一下C++深浅拷贝和string类的写法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、深浅拷贝拷贝这个词对于我们来说应该不陌生,比如我们平...
      99+
      2023-06-29
    • Python中怎么实现深浅拷贝
      这篇文章将为大家详细讲解有关Python中怎么实现深浅拷贝,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、深浅copy  1.  赋值运算l1 = ...
      99+
      2023-06-15
    • C++中怎么实现浅拷贝
      这篇文章给大家介绍C++中怎么实现浅拷贝,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,...
      99+
      2023-06-17
    • C++深浅拷贝和string类的两种写法详解
      目录一、深浅拷贝二、string类的两种写法1. 传统写法2. 现代写法总结一、深浅拷贝 拷贝这个词对于我们来说应该不陌生,比如我们平常的复制和粘贴就是拷贝;但是如果把拷贝这个词放到...
      99+
      2024-04-02
    • C++构造函数的类型,浅拷贝与深拷贝实例分析
      本文小编为大家详细介绍“C++构造函数的类型,浅拷贝与深拷贝实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++构造函数的类型,浅拷贝与深拷贝实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、无...
      99+
      2023-06-29
    • JavaScript怎么实现深拷贝
      本篇内容主要讲解“JavaScript怎么实现深拷贝”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript怎么实现深拷贝”吧!什么是浅拷贝关于浅拷贝的概念,我在网上看到一种说法,直接...
      99+
      2023-06-27
    • 怎么在java中实现浅拷贝
      这篇文章给大家介绍怎么在java中实现浅拷贝,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企...
      99+
      2023-06-14
    • 怎么从C++的角度分析PYTHON的深浅拷贝
      这篇文章主要讲解了“怎么从C++的角度分析PYTHON的深浅拷贝”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么从C++的角度分析PYTHON的深浅拷贝”吧!今天看到python的列表深浅...
      99+
      2023-06-04
    • 怎么在JavaScript中实现深拷贝
      怎么在JavaScript中实现深拷贝?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,...
      99+
      2023-06-14
    • C++中怎么实现文件拷贝
      C++中怎么实现文件拷贝,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++文件拷贝代码示例:#include< iostream.h> &nb...
      99+
      2023-06-17
    • 怎么在JavaScript中实现对象深拷贝
      这篇文章给大家介绍怎么在JavaScript中实现对象深拷贝,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释器被称为JavaSc...
      99+
      2023-06-14
    • 怎么使用json方式实现深拷贝
      使用json方式实现深拷贝的步骤如下:1. 将要拷贝的对象转换为json格式的字符串。2. 将json字符串转换回对象。以下是一个示...
      99+
      2023-09-05
      json
    • JSON.stringify实现深拷贝的坑怎么解决
      这篇“JSON.stringify实现深拷贝的坑怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JSON.string...
      99+
      2023-07-02
    • 怎么在java中利用Arrays.copyOf实现浅拷贝
      怎么在java中利用Arrays.copyOf实现浅拷贝?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编...
      99+
      2023-06-14
    • c语言指针怎么实现字符串拷贝
      在C语言中,可以使用指针来实现字符串拷贝。以下是一种常见的方法: #include void stringCopy(char *...
      99+
      2023-10-27
      c语言
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作