魔法之线:探索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无法根据参数名获取数据。 正确获取方式如…...
脚本管理工具怎么选?从3个维度重新认识ScriptCat与油猴
脚本管理工具怎么选?从3个维度重新认识ScriptCat与油猴 【免费下载链接】scriptcat ScriptCat, a browser extension that can execute userscript; 脚本猫,一个可以执行用户脚本的浏览器扩展 项目地址: https://gitcode.com/gh_mirrors/sc/scriptcat …...
基于 InHand ER815 ER2000 的企业分支 SD-WAN 组网方案实践
一、项目背景随着连锁门店、企业分支数量不断增加,传统专线或宽带方案逐渐暴露出以下问题:网络成本高(专线费用昂贵)部署周期长(跨区域开通困难)运维复杂(缺乏统一管理能力)与此同时…...
跨境电商最最常用的接口列表与接入
跨境电商最核心、最常用的接口集中在 商品、订单、库存、物流、支付、店铺 / 授权 六大类。下面按 全球主流平台(亚马逊、Shopify、速卖通、Shopee、eBay) 给出 常用接口清单 标准接入流程 关键技术点。一、跨境电商最常用接口分类(通用&am…...
推荐一家专业做标签打印软件
1. 上海敖维科技(本地自研代理双强) • 定位:中大型企业/工厂级标签管理,上海本土17年行业经验 • 核心产品: ◦ 自研:码尚智汇链/云标签平台(B/S架构,模板云端下发、打印监控、追溯…...
Nginx 学习总结式
1. 引入 在现代 AI 工程中,Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的,官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为,最好的办法…...
还在手写网页?CMS才是高效建站的正确打开方式
在网站开发的早期阶段,手写网页是主流方式。开发者需手动编写HTML、CSS、JavaScript等代码,从页面结构搭建到内容填充,每个环节都需要逐行编码。这种方式在技术层面具有极高的自主性,适合小型静态页面或对代码细节有极致要求的场景…...
VMware macOS解锁终极实战指南:5步让Windows/Linux完美运行苹果系统
VMware macOS解锁终极实战指南:5步让Windows/Linux完美运行苹果系统 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 在虚拟化技术日益普及的今天,许多开发者和技术爱好者都希望能…...
如何使用HS2-HF_Patch优化Honey Select 2游戏体验:完整指南
如何使用HS2-HF_Patch优化Honey Select 2游戏体验:完整指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是一款专为《Honey Select …...
Linux Docker 安装与使用详细教程
一、Docker 概述 1.1 什么是 Docker? Docker 是一个开源的应用容器引擎,基于 Go 语言开发并遵从 Apache2.0 协议开源。它可以让开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,实现虚…...
3个革新性步骤:Cursor Free VIP突破AI编程助手使用限制
3个革新性步骤:Cursor Free VIP突破AI编程助手使用限制 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tr…...
