【C++】string类的简单模拟实现

目录

string类初识

string模拟实现

string类成员变量

构造函数

拷贝构造

赋值运算符重载

析构函数

深浅拷贝问题


string类初识

由于C语言中的字符串不太符合OOP(面向对象编程)的思想,而且其底层空间需要用户自己管理,经常有访问越界的情况出现。

而在C++中,为了更好地规避这些问题,就出现了string类来对字符串进行更好的封装使用,使得字符串的操作更简单,方便,快捷。

string模拟实现

string作为表示字符串的字符串类,提供了很多字符串操作的接口。平时只要能熟练地配合文档使用即可。而在面试时,很多面试官喜欢让学生模拟实现一个简单的string类。主要实现的还是string类的构造,拷贝构造,赋值运算符重载以及析构函数等。当然尝试模拟实现还能够帮助我们更好地去理解string类的底层,从而在面对出错时能更有把握地解决问题。

string类成员变量

class String
{
private:
    char* _str;
// 指向存放的字符串
    size_t _size; // 字符串的有效长度
    size_t _capacity; // 开辟空间的容量大小
};

构造函数

String(const char* str = "")
{
    _size = strlen(str);
    _capacity = _size;
    _str = new char[_capacity + 1];

    strcpy(_str, str);
}

拷贝构造

void swap(string& tmp)
{

    // 复用全局的swap函数
    ::swap(_str, tmp._str);
    ::swap(_size, tmp._size);
    ::swap(_capacity, tmp._capacity);
}


String(const String& s)
    : _str(nullptr)
    , _size(0)
    , _capacity(0)
{
    String tmp(s._str);
// 复用构造来生成临时的string对象
    swap(tmp); // 通过交换来完成拷贝构造
}

赋值运算符重载

String& operator=(String s) // 在传参阶段完成拷贝构造
{
    swap(s);
// 交换之后完成赋值
    return *this; 
}
// 函数调用结束,s对象销毁,空间会被回收

析构函数

~String()
{
    delete[ ] _str;
    _str = nullptr;
    _size = _capacity = 0;
}

深浅拷贝问题

浅拷贝:也叫值拷贝。编译器只是将对象中的值进行拷贝。如果对象中存在资源管理(例如动态内存开辟),使用浅拷贝会导致多个对象共用一份资源,必然会存在“争夺”的情况。

 深拷贝:让每个对象都有一份独立的资源,不要和其它对象共享,这就是深拷贝要达到的效果。如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数一般都要按照深拷贝的方式显式给出。

所以,string类的拷贝构造和赋值运算符重载必须写成深拷贝。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/14135.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决方案:Zotero实现参考文献中英文混排,将英文文献中的“等”转成“et al.”

Zotero 是一款非常实用且易于使用的参考文献管理工具,可帮助用户收集、整理和引用各种类型的文献,包括图书、期刊文章、网页等。在学术写作中起着重要作用。 但是其在中文世界中,运行起来偶尔会出现问题,这里记录一个问题及其解决…

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…

java 获取时间的方法

Java的时间是通过字节码指令来控制的,所以 java程序的运行时间是通过字节码指令来控制的。但是由于 Java程序在运行时, JVM会产生一些状态,所以在执行 JVM指令时, JVM也会产生一些状态。 我们在执行 java程序时,主要是…

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结…

IEEE14节点系统在如短路分析,潮流研究,互连电网中的研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

easyrecovery16最新数据恢复软件密钥使用方法教程

easyrecovery是一款专业的数据恢复软件,其最新版本为easyrecovery2023将于2022年底发布。总之,easyrecovery是一款功能齐全、性能稳定的专业数据恢复软件,无论删除文件、格式化分区或磁盘故障,它都可以提供最高的恢复成功率。值得个人用户选用。此版本在功能和性能上有较大提升…

BBR原版/魔改/plus/锐速/七合一脚本linux加速脚本/硬盘挂载/cc防御/宝塔

BBR原版/魔改/plus/锐速七合一脚本linux加速脚本/硬盘挂载/CC防御/宝塔 新云分享的七合一脚本,包含原版BBR、魔改BBR、bbrplus以及锐速可选。 在vultr上Centos 7, Debian 8/9, Ubuntu 16/18测试通过,不支持ovz。 安装指令:复制下面命令在s…

基于构效关系模型的药物设计(QSAR)

基于构效关系模型的药物设计(QSAR) 定量构效关系(QSAR,Quantitative Structure-Activity Relationship)分析是指利用理论计算和统计分析工具来研究系列化合物结构(包括二维分子结构、三维分子结构和电子结…

【Maven 入门】第二章、Maven核心程序解压与配置

一、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 本文以maven-3.3.8为例 具体下载地址:https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…

【问题记录】docker 搭建 minio

一、搭建过程 docker 搜索minio镜像 docker search miniodocker 拉取镜像 docker pull minio/miniodocker 启动 minio docker run -p 9900:9900 --name minio -d --restartalways -e MINIO_ACCESS_KEYminio -e MINIO_SECRET_KEY1qazWSX -v /usr/local/minio/data:/data -v …

vue-cli的使用和单页面应用程序、使用vue-cli脚手架创建vue项目步骤

1.vue-cli的使用 vue-cli是Vue.js开发的标准工具。它简化了程序员基于webpack创建工程化的Vue项目的过程。 引用自vue-cli官网上的一句话: 程序员可以专注在撰写应用上,而不必花好几天去纠结webpack配置的问题。 中文官网: https://cli.vuejs.org/zh/ 1.1 安装 …

8年测开年薪30W,为什么从开发转型为测试?谈谈这些年的心路历程……

谈谈我的以前,从毕业以来从事过两个多月的Oracle开发后转型为软件测试,到现在已近过去8年成长为一个测试开发工程师,总结一下之间的心路历程,希望能给徘徊在开发和测试之前的同学一点小小参考。 一、测试之路伏笔 上学偷懒&#…

updateByPrimaryKey和updateByPrimaryKeySelective的区别

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl MyBatis Generator概述 MyBatis Generator是一个专门为MyBatis框架使用者定制的代码生成器,它可以快速的根据表生成对应的映射文件、接口文件、POJO。而且&#…

哪个品牌的洗地机更好用?热门洗地机盘点

洗地机没有使用过之前一直怀疑是不是智商税,等到后面体验过之后,发现是真的香。因为不可否认的是,洗地机的清洁力还是不错的。不仅能够快速清洁干净地面,大大的节省了我们的清洁用时,操作起来也省心省力。作为一个洗地…

Linux下实现C语言程序

一.情况说明 写这篇博客的情况比较复杂,首先我本来是参加新星计划按照规划现在去学习shell脚本语言的,但是博主现在由于其他原因需要了解makefile,makefile是Linux系统下的一种工具,makefile的一些背景要涉及链接库的知识&#xf…

css初入门:网页布局之网格布局-grid

文章目录 网格布局-grid1、设置网格布局2、网格布局介绍3、网格容器grid-template-columns属性grid-template-rows 属性justify-content 属性justify-items属性align-content 属性 4、网格项目grid-column-start、grid-column-start、grid-column属性grid-row-start、grid-row-…

4.2.2字符串KMP算法

对朴素模式匹配算法的优化: 当我们匹配最后一个字符才发现匹配失败。 那么前面这些字符一定是与模式串对应的。 通过模式串的部分匹配 朴素模式匹配算法优化思路: 不匹配的字符之前,一定是和模式串一致的。 可以跳过中间好几个没有必要的对比…

如何将项目提交到别人的仓库

大纲: 1、在gitee中克隆(clone)别人仓库的代码。 首先,进入别人的仓库,点击 克隆/下载 2、在你存放项目的文件夹下克隆你刚刚复制的代码 (右键点击Git Clone即可) 点击OK 就开始克隆了 克隆成功之后,文件上…

Maya英文界面怎么改为中文界面

Maya是一款3D动画和视觉效果软件,用于创建逼真的角色和大片般的效果,也是受到电影、电视和游戏行业的 3D 建模师、动画师、照明艺术家和 VFX 艺术家等多数人喜爱的一款3D软件。我们在使用Maya的过程中,常常会遇到一些小阻碍,比如M…

蓝牙耳机接打电话哪个比较好?接打电话最好的蓝牙耳机

技术已经发展到如此程度,耳机可以淹没嘈杂环境中不断出现的杂音,同时还能让我们在通话、音乐和娱乐方面保持清晰,既然如此,我们就来整理一下2023年适合通话和娱乐的无线耳机清单。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#x…
最新文章