魔法之线:探索string类的神秘世界

🎉个人名片:
🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🙈个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉
————————————————
🎉文章简介:
🎉本篇文章对 string的模拟实现 等相关知识 学习的相关知识进行分享!
💕如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加 油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉
———————————————————————————
一.前言
上篇文章*《C++string类的介绍及常用函数用法总结》*(文章链接: link)相信大家已经对string类的使用等方面详细了解了,为了更好的了解string的特性,今天我们通过string类的底层结构来手撕一个属于我们自己的类,方便更加深刻的理解这部分内容。
二.string类的模拟实现
先看一下string类里面所需要包含的成员变量:
private:char* _str; //指向存储字符串的指针size_t _size; //记录存储的有效数据个数size_t _capacity; //记录空间大小
重点实现的函数
一.构造函数
string(const char* str = "") //空字符串里面默认放的\0{_size = strlen(str);_capacity = _size;_str = new char[_capacity+1];strcpy(_str, str);}
避坑
常见错误与不合适的写法写法:
第一种:
这种是直接将成员变量全部初始化为0处理;
string():_str(nullptr),_size(0) ,_capacity(0)
{
}
不合理之处:
1.库里面string类既能能用常量字符串去构造对象,也可以无参构造对象,这样写不能达到和库里面的一样;
2._str是指向一个字符串的指针,应该以 ‘\0’ 结束,直接初始化为nullptr不能达到该效果;
3.其他函数对指针处理不当,很有可能会对指针进行解引用访问,会对空指针解引用;
第二种:
1.库里面string类既能能用字符串去构造对象,也可以无参构造对象,这样写不能达到和库里面的一样;
2.这样写构造函数效率低,每次初始化变量时都要去计算str长度,虽然可以先初始化_size,再去用_size去初始化其他变量,但是必须保证成员变量先声明_size;初始化顺序与声明顺序一样才行,代码维护性低;
string(const char* str):_str(new char[strlen(str) + 1]),_size(strlen(str)) //不合适的写法,_capacity(strlen(str)){strcpy(_str, str); //会将\0拷贝进去}
第三种:
1.错误写法,将’\0’赋值给str,类型不匹配,会报错;
string(const char* str='\0') //会报错,类型不匹配{_str = new char[1];_size = 0; _capacity = 0;_str[0] = '\0';}
二.拷贝构造函数
第一种:传统写法

//s1(s2)
string(const string& s)
{_str = new char[s._capacity + 1]; //开空间strcpy(_str,s._str); //拷贝_size = s._size; //赋值_capacity = s._capacity;}
第二种:现代写法
直接用s的_str构造tmp对象,然后两个对象交换即可;
string(const string& s){string tmp(s._str);swap(tmp);}
三.赋值运算符重载
第一种:传统写法
//s1=s2string& operator=(const string& s){char* tmp = new char[s._capacity + 1]; //开空间strcpy(tmp, s._str); //拷贝std::swap(tmp, _str); //交换指针_size = s._size; //赋值_capacity = s._capacity;return *this;}

第二种.现代写法
//s1=s2string& operator=(string s){swap(s);return *this;}

这里的巧妙在于没有用传引用传参,用的传值传参,s是s2的拷贝,s的改变不影响s2,调用上面实现的swap函数,交换s与s1,s1就指向了s指向的空间,_size和_capacity都与s的一样,出了作用域,s会调用析构函数清理掉s1之前的空间;
四.析构函数
~string(){delete[] _str;_str = nullptr;_size = 0;_capacity = 0;}
五.运算符[ ]重载
char operator[](size_t pos){return _str[pos]; //返回对应的值}char operator[](size_t pos)const{return _str[pos];}
六.流提取运算符重载
ostream& operator<<(ostream& out, const string& s)
{for (int i = 0; i < s.size(); i++){cout <<s[i];}cout << endl;return out;
}
七.流插入运算符重载
注意:
这里不能使用 scanf 和 getchar ,因为他们是遇到空格或则\0就会停止获取,就导致ch不会等于’ ’ 和 ‘\0’,那么while循环无法结束;这里使用的是istream类里面的get函数;
istream& operator>>(istream& in, string& s){char ch;ch = in.get(); while (ch!=' '&&ch!='\0'){s += ch; //尾插到sch = in.get(); }return in;}
八.迭代器的实现
typedef char* iterator;
typedef const char* const_iterator;
iterator begin()
{return _str;
}
const_iterator begin()const
{return _str;
}
iterator end()
{return _str + _size;
}
const_iterator end()const
{return _str+_size;
}
相关文章:
魔法之线:探索string类的神秘世界
🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…...
使用gnvm下载nodejs和npm
目录 前言 一、下载gnvm 二、利用gnvm下载nodejs 三、下载对应版本的npm 四、gnvm常用的命令 总结 前言 由于之前下载的版本过低,需要升级版本。但在使用gnvm升级node版本时遇到了一系列的问题,索性就把nodejs全部删除,重新用gnvm在下…...
C语言——简易版扫雷
目录 前言 编辑 游戏规则 游戏结构的分析 游戏的设计 使用多文件的好处有以下几点: 游戏代码实现 框架(test.c) game函数(test.c) InitBoard初始化(game.c) Print打印棋盘(g…...
L3自动驾驶的“双保险”:冗余EPS关键技术解析
摘要: 本文主要介绍冗余EPS的发展路径和关键技术。 引言 在乘用车领域,电动助力转向系统(Electric Power Steering,EPS)相比传统的液压助力转向系统(Hydraulic Power Steering,HPS)具有结构简单、响应迅速、能耗低等优点,因此应用很广。随着智能驾驶的发展,作为底层…...
java.net.UnknownHostException
目录 报错信息 报错分析 UnknownHostException 分析 尝试解决 域名 报错可能 网络请求: 数据库连接: Socket通信: 总结: 报错信息 java.net.UnknownHostException Caused by: java.net.UnknownHostException:at java.…...
比派电器T6白色系高速吹风机,高品质保证下,追求极致性价比
广东比派电器科技有限公司于2020年成立于东莞市松山湖高新技术企业园区融易大厦,公司聚焦于小家电的研发,生产,销售。专注在小家电的PCBA研发,产品设计,成品生产。提供小家电产品一站式解决方案,致力于成为…...
每天学习一个Linux命令之ss
每天学习一个Linux命令之ss 在Linux中,网络管理是非常重要的一项工作。ss(Socket Statistics)是一个强大的命令行工具,用于获取各种网络套接字统计信息。它可以帮助我们查看网络连接、监听套接字、路由表、组播成员等信息。本文将…...
Qt的信号槽机制
1. 什么是元对象编译器和元对象系统? 在开始讲信号槽之前,我们先了解下Qt的框架的核心组成部分,Qt的元对象编译器(MOC)和元对象系统是Qt框架的核心组成部分,它们使得Qt拥有了信号与槽机制、反射(…...
跨域问题总结
文章目录 概要web应用整体请求流程技术名词解释跨域问题产生的原理解决方案前端代码角度前端服务器角度后端代码角度后端服务器角度 小结 概要 在不成熟的前后端开发过程中,经常遇到跨域问题; 在前后端分离的模式下的开发过程中,经常遇到跨域…...
K8s-MySQL主从集群
K8s-MySQL主从集群 引言 该案例代码均可从https://github.com/WeiXiao-Hyy/k8s_example 获取,欢迎Star! 需求 一个“主从复制”的MySQL集群有一个主节点Master有多个从节点Slave从节点需要能水平扩展所以写操作只能在主节点上执行读操作可以在所有节点…...
seo js转码工具
js转码工具作用 用于把js加密 如果不想让别人看到自己的js 代码就可以使用这个方法 js工具网址 https://tool.chinaz.com/js.aspx 效果...
【SQL】601. 体育馆的人流量(with as 临时表;id减去row_number()思路)
前述 知识点学习: with as 和临时表的使用12、关于临时表和with as子查询部分 题目描述 leetcode题目:601. 体育馆的人流量 思路 关键:如何确定id是连续的三行或更多行记录 方法一: 多次连表,筛选查询方法二&…...
java上传本地文件到服务器共享
在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…...
Redis场景总结
使用场景 在大型的秒杀库存扣减,app首页流量高峰,很容易将传统的关系型数据库(mysql,oracle等)给压垮。 还有很多没必要持久化的数据,比如说短信验证码,点赞数等。 分布式锁。 分布式缓存(会话共享)。 …...
2024.3.11 C++作业
1、提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {char str[20];cout << "please enter the str:";gets(str);in…...
【wps】wps与office办公函数储备使用(结合了使用案例 持续更新)
【wps】wps与office办公函数储备使用(结合了使用案例 持续更新) 1、TODAY函数 返回当前电脑系统显示的日期 TODAY函数:表示返回当前电脑系统显示的日期。 公式用法:TODAY() 2、NOW函数 返回当前电脑系统显示的日期和时间 NOW函数:表示返…...
初级爬虫实战——伯克利新闻
文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…...
WPF资源的继承
假设这里有一个全局的资源 <Style TargetType"TextBlock"><Setter Property"FontSize" Value"40"/> </Style> 这是时候有些控件可能需要一个样式在这个基础上加一点内容的 <Style x:Key"textBlockStyle" Targ…...
linux网络通信(TCP)
TCP通信 1.socket----->第一个socket 失败-1,错误码 参数类型很多,man查看 2.connect 由于s_addr需要一个32位的数,使用下面函数将点分十进制字符串ip地址以网络字节序转换成32字节数值 同理端口号也有一个转换函数 我们的端口号位两个字…...
Mybatis 多个简单类型参数传入sql语句
如果只有一个简单类型的参数传入sql语句,我们可以在在#{}中可以随意命名,都可以获取到数据。但通常与接口方法中的参数同名。 但是如果有多个简单类型参数,如果没有特殊处理,那么Mybatis无法根据参数名获取数据。 正确获取方式如…...
top50 BF16算力(TFLOPS) 显卡排行榜 天梯图
排名显卡型号BF16算力(TFLOPS)售价(元)单TFLOPS价格(元)1B200(SXM)45002200000488.892H200(SXM)19801200000606.063MI300X1307750000573.834H100 SXM519501100000564.105RTX PRO 6000 Blackwell1150780000678.266H100 PCIe 80GB1560850000544.877RTX 50906803400050.008A100 80…...
亚马逊 Rufus 关停,Alexa 正式上线:卖家必须读懂的6条新规则
2026年5月13日,亚马逊官方正式宣布,下线Rufus,推出全新AI购物助手:Alexa for Shopping。但是,这不是粗暴地直接下线 Rufus,而是一次购物AI底层架构的重组 —— 将 Rufus 的商品专长 与 Alexa的用户理解力&a…...
鸿蒙系统微博应用锁常见问题解答
为微博设置应用锁后,不少用户会有各种疑问:忘记密码怎么办?会不会影响消息推送?能不能只锁定某些功能?应用锁耗电吗?本文将针对这些高频问题逐一解答,帮助您更好地使用鸿蒙系统(Harm…...
组态王通用扫码枪配置
使用组态王扫码枪驱动,是绑定变量,扫码后直接就可以显示扫码内容。解决每次扫码输入数据时必须先用鼠标点进输入框内的问题。驱动安装先添加驱动,亚控网站的文件为 barcodescanner,这个文件是组态王通用扫码枪的驱动,但…...
为内部知识库问答机器人接入Taotoken多模型增强回答效果
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内部知识库问答机器人接入Taotoken多模型增强回答效果 构建一个高效的企业内部知识库问答机器人,核心挑战在于如何让…...
长期使用Taotoken聚合服务对项目月度账单的可预测性提升
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合服务对项目月度账单的可预测性提升 在AI驱动的项目开发与运营中,成本控制与预算规划是团队管理者…...
Unity UI交互进阶:手把手教你打造一个支持单击、双击、长按的万能按钮组件
Unity UI交互进阶:手把手教你打造一个支持单击、双击、长按的万能按钮组件在游戏开发中,UI交互的流畅性和多样性直接影响玩家的游戏体验。想象一下,当你在开发一个RPG游戏的背包系统时,需要实现道具的单击查看详情、双击快速使用、…...
WebSocket实时通信架构进阶:Room、命名空间与集群部署
WebSocket实时通信架构进阶:Room、命名空间与集群部署 作者:Crown_22 | AI Agent & Hermes Agent 桌面程序开发者 前言 WebSocket已经成为实时应用的标准技术,但大多数教程只停留在"建立连接、发送消息"的基础阶段。在生产环境中,你需要处理Room管理、命名空…...
终极Chrome画中画扩展:如何在浏览器中实现高效视频多任务处理
终极Chrome画中画扩展:如何在浏览器中实现高效视频多任务处理 【免费下载链接】picture-in-picture-chrome-extension 项目地址: https://gitcode.com/gh_mirrors/pi/picture-in-picture-chrome-extension 想要在浏览网页、处理文档的同时继续观看视频内容吗…...
收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备
如今人工智能早已脱离概念炒作阶段,全面扎根企业实际业务场景,成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道,行业心态也从初期观望试探,彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...
