魔法之线:探索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=s2
	string& 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=s2
	string& 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;      //尾插到s
			ch = 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;
}

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

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

相关文章

Java SE String类(一):常用方法(上)

1. 常用方法 1.1 字符串构造 String类的常用构造方法只有以下三种 public class Main {public static void main(String[] args) {String s1 "hello";//使用常量串进行构造String s2 new String("hello");//创建String对象char[] array {h,e,l,l,o};…

基于springboot的医护人员排班系统

预览地址 论文预览https://pan.imgbed.link/kkpreview/onlinePreview?urlaHR0cHM6Ly9wYW4uaW1nYmVkLmxpbmsvZmlsZS8yMTYxNT9mdWxsZmlsZW5hbWU95Z%2B65LqOc3ByaW5nYm9vdOeahOWMu%2BaKpOS6uuWRmOaOkuePreezu%2Be7n%2BiuuuaWhy5kb2M%3D 链接&#xff1a;https://pan.baidu.com/s/…

数据复制:释放新质生产力的关键钥匙

今年两会&#xff0c;新质生产力成为最热词汇&#xff0c;引起社会各界广泛关注。 所谓新质生产力&#xff0c;本质是一种新型的生产力形态&#xff0c;它由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生&#xff0c;以劳动者、劳动资料、劳动对象及其优化组合…

24-Java策略模式 ( Strategy Pattern )

Java策略模式 摘要实现范例 策略模式的重心不是如何实现算法&#xff0c;而是如何组织、调用这些算法&#xff0c;从而让程序结构更加灵活&#xff0c;具有更好的维护性和扩展性。 策略模式属于行为型模式 摘要 1. 意图 针对一组算法&#xff0c;将每一个算法封装到具有共…

【C++进阶】C++继承概念详解

C继承详解 一&#xff0c;继承的概念和定义1.1 继承的概念1.2 继承的定义1.3 继承关系和访问限定符 二&#xff0c;基类和派生类的对象赋值转移三&#xff0c;继承的作用域四&#xff0c;派生类的默认成员函数五&#xff0c;继承和友元&静态成员和继承六&#xff0c;菱形继…

【案例】义乌佛堂智慧蔬菜产业园投入使用,为高效农业提供技术保障

项目背景 佛堂蔬菜产业园位于佛堂镇毛陈村&#xff0c;由义乌市市场发展集团旗下义乌市农业开发有限公司负责打造。园区于2021年开始筹建&#xff0c;总投资5000万元&#xff0c;占地面积约450亩&#xff0c;建有标准化蔬菜大棚72个。 传统大棚对农民依赖性特别强&#xff0c;需…

视频素材哪里找?几个高清短视频素材下载网站分享

哥们姐妹们&#xff0c;是不是在追求完美的短视频创作路上因为找不到那个令人心动的高清视频素材而头大呢&#xff1f;别着急&#xff0c;我这儿有几个秘密武器&#xff0c;即几个超给力的短视频素材网站&#xff0c;让你的作品从此分分钟高大上起来 1&#xff0c;蛙学府 这里…

什么是模块化机房?

在这个数据驱动的时代&#xff0c;数据中心的作用变得日益重要。而模块化机房&#xff0c;作为一种创新的数据中心解决方案&#xff0c;正在逐渐改变我们构建和管理这些关键设施的方式。但究竟什么是模块化机房呢&#xff1f;它又为何受到越来越多行业的青睐&#xff1f;在本文…

Caffeine--实现进程缓存

本地进程缓存特点 缓存在日常开发中起着至关重要的作用, 由于存储在内存中, 数据的读取速度非常快,能大量减少对数据库的访问,减少数据库的压力. 缓存分为两类: 分布式缓存, 例如Redis: 优点: 存储容量大, 可靠性更好, 可以在集群间共享缺点: 访问缓存存在网络开销场景: 缓存数…

1688平台最关键的接口接入实例|获得1688商品详情| 按关键字搜索商品| 按图搜索1688商品(拍立淘)| 获得淘口令真实url

参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_get,item_search]cache:[yes,no]默认yes&#xff0c;将调用缓存的数据&#xff0c;速度比较快result_type:[json,xml,serialize,var_export]返回数据格式&#xff0c;默认为jsonl…

pytorch CV入门3-预训练模型与迁移学习

专栏链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑&#xff1a;2024/3/7&#xff1b;最后编辑&#xff1a;2024/3/8 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…

三个el-radio选项怎么知道用户选择了哪一个

问: 回答: 要获取用户选择了第二个还是第三个 <el-radio>&#xff0c;你可以在 change 事件处理函数 changeAPPVersion 中判断选中的值是什么。你需要给第二个和第三个 <el-radio> 设置不同的值&#xff0c;然后在 changeAPPVersion 方法中根据这个值来确定用户选…

Selenium自动化测试面试题全家桶

1、什么是自动化测试、自动化测试的优势是什么&#xff1f; 通过工具或脚本代替手工测试执行过程的测试都叫自动化测试。 自动化测试的优势&#xff1a; 1、减少回归测试成本 2、减少兼容性测试成本 3、提高测试反馈速度 4、提高测试覆盖率 5、让测试工程师做更有意义的…

建造家庭泳池位置选择尤为重要

建造家庭泳池位置选择尤为重要 在自家别墅庭院中建造一座游泳池是很多人的梦想&#xff0c;因为有泳池家人健身起来是非常方便的&#xff0c;但是建造泳池选择合适的位置显得尤为关键&#xff0c;因为合适的选址可以带来美观性及在泳池的日常使用维护中也起到了很重要的作用。…

idea实现ssh远程连接服务器

1. 首先&#xff0c;打开idea&#xff0c;点击左上角File->settings 2. 点击tools->SSH Configurations->填写必要的信息&#xff0c;Host就是访问服务器的ip地址&#xff0c;Username就是服务器的用户账户&#xff0c;比如root&#xff0c;Password账户对应的密码&am…

如何克服应用程序性能监控( APM )面临的挑战

应用程序性能监控&#xff08;APM&#xff09;使组织能够监控性能 其关键业务应用程序的指标&#xff0c;在出现性能问题时及时收到警报&#xff0c;以及生成用于定期性能分析的报告。应用程序性能监视工具对于任何依赖应用程序的组织来说都是必不可少的&#xff0c;它可以帮助…

【渗透测试】常见文件上传漏洞处理与防范

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;网络安全渗透 景天的主页&#xff1a;景天科技苑 文章目录 1.文件上传漏洞1.1. 描述1.2. 危害1.3. 有关文件上传的知识1.4…

VB购房系统-175-(代码+开题+文献综述+翻译+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword175 1/客户资料登记那张表上不能以客户身份证号作为主键&#xff0c;因为一般来看房的客户不会留下身份证号码&#xff0c;实施起来有难度&#xff0c;你可以设置一个自动编号字段&#xff0c;以这个字段来作为主键。…

电商数据分析|电商数据采集|Python数据采集|电商API接口数据采集系统搭建

电商API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是指电商平台开放的一组数据接口&#xff0c;通过这些接口可以实现对电商平台商品、订单、物流等信息进行访问、查询、修改、删除等操作。电商API接口涉及到的主要数据包括&…

[论文笔记]跨语言摘要最新综述:典型挑战及解决方案

https://arxiv.org/abs/2203.12515 跨语言摘要是指为给定的一种语言(例如中文)的文档生成另一种语言(例如英文)的摘要。 图1:四个端到端框架的概述。XLS:跨语言摘要;MT:机器翻译;MS:单语摘要。虚线箭头表示监督信号。无框彩色方块表示相应任务的输入或输出…
最新文章