c++[string实现、反思]

news2024/11/17 3:34:53

我的码云

我的string码云

分析总结

1.项目结构

所有的类和函数需要在namespace中实现,要和string高度对应

	private:
		char* _str;//字符串
		size_t _size;//有效长度
		size_t _capacity;//总空间,包括'\0'

		const static size_t npos=-1;
2.定义变量

<1> 所有的变量和函数要放到class中,而且要规定private类型
<2> 其中有一个是特殊的,const static size_t npos=-1;这是需要特别记忆,size_t npos赋值为-1,表示无符号整形的最大值
对于长度和总空间一定不会是小于0的,我们依旧设为无符号整形

3.调试代码区域

因为这是在namespace中实现的,我们调试代码可以需要加上using namespace或者直接在namespace中写一个调试函数
在这里插入图片描述

4.构造函数
		string()
			:_str(new char[sizeof(char)*4]),
			_size(0),
			_capacity(4)
		{
			_str[0] = '\0';
		}

对象初始化的时候,我们首选初始化列表进行初始化(效率更高),并且我们在初始化列表中,为了防止别人随便改变变量定义的顺序,导致初始化列表错乱,我们会选择在函数中进行初始化。(初始化列表的初始化顺序并不是根据列表中数据出现的顺序决定的,而是由定义的顺序决定的)

		string()
		{
			_size = 0;
			_capacity = 4;
			_str = new char[_capacity];
			_str[0] = '\0';
		}

在初始话的时候还要注意变量的值要选取合适,并且要注意字符串的结尾不论是有没有字符串都应该为'\0'

拷贝构造和析构函数
string(const string& other)
{
	_size = other._size;
	_capacity = other._capacity;
	_str = new char[sizeof(char) * _capacity];
	strcpy(_str, other._str);
}

~string()
{
	delete[] _str;
}

代码中char数组需要设为动态的空间,要进行深拷贝防止浅拷贝带来的问题
拷贝构造中要注意加const防止传来的是匿名对象匿名对象有常性,需要const修饰才行,对于重载=也是需要加const

重载运算符
类内
	friend ostream& operator<<(ostream& out, string& str);
	friend istream& operator>>(istream& in, string& str);
	
类外
	ostream& operator<<(ostream& out, string& str)
	{
		cout << str.c_str();
		return out;
	}
	istream& operator>>(istream& in, string& str)
	{
		cin >> str._str;
		return in;
	}

等我回来再叙述iostream

因为这个是<<和>> 必须要在类外实现,并且要调用类中private成员变量,我们必须使用friend标识符
我在<<调用的c_str()函数也就是说,我们的<<可以不用再类内声明成friend
也就是说,只有在需要调用类中的变量的时候才需要写成friend

迭代器
简单介绍

1.using namespace 的情况下

	string::iterator it=str.begin();

2.没有使用using namespace 的定义形式

	bit::string::iterator tem;

既要指明namespace又要指明class

实现

iterator是一个类型,他定义了it,it接收了begin()的返回值,it要对char数组进行访问,而且要能通过it自增进行连续的访问,那么it就应该是指针类型char*,同时又要写成iterator的形式,就需要进行typedef

		typedef char* iterator;//必须要将这个定义放出来,不然类外就无法使用声明

		iterator begin()
		{
			return _str;
		}
		iterator end()
		{
			return _str + _size + 1;
		}

在写end函数的时候一定要清楚,end指向的是整个数组结尾的下一个位置
typedef char* iterator;这个定义一定要放到public中,不能放到private中,因为在外面进行定义迭代器的时候需要访问到iterator这个类型

::作用域操作符,可以对类内public静态成员变量和函数进行访问,以及上面这种类型进行访问

reserve和resize
		void resize(size_t n, char c = '\0')
		{
			delete[] _str;

			_str = new char[sizeof(char) * (n + 1)];

			_size = n;
			_capacity = n + 1;
			for (int i = 0; i < n; i++)
				_str[i] = c;
			_str[n] = '\0';
		}
		void reserve(size_t all)
		{
			int flag = 0;
			while (all >= _capacity)
				_capacity *= 2, flag = 1;
			if (flag)
			{
				char* tem = _str;
				_str = new char[_capacity];
				strcpy(_str, tem);
			}
		}

reserve如果是缩小的话,不影响空间,不影响数据
resize如果是缩小的话,影响空间,影响数据

substr
		string substr(size_t start=0, size_t n=npos) const
 		{
			string ans;//临时变量,不能返回引用
			if (start >= _size) return ans;
			for (int i = start; i < start + n && i < _size; i++)
				ans.push_back(_str[i]);

			return ans;
		}

在使用substr的时候,string ans;是临时变量,不能返回引用,虽然string内部的数组是动态开辟的,但是函数结束的时候,就会自动调用析构函数释放空间

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JUC】一篇通关JUC并发之共享模型

目录 1. 共享带来的问题1-1. 临界区 Critical Section1-2. 竞态条件 Race Condition1-3. synchronized 解决方案 1. 共享带来的问题 1-1. 临界区 Critical Section 一个程序运行多个线程本身是没有问题的问题出在多个线程访问共享资源 多个线程读共享资源其实也没有问题在多个…

程序员职场可能遇到的问题总结!

在职场中&#xff0c;你是否遇到过这样的领导或同事&#xff0c;他可能是自恋狂&#xff0c;自吹自擂自我标榜&#xff1b;可能是团队合作的绊脚石&#xff0c;对团队合作态度消极并频繁拖后腿&#xff1b;可能是抱怨专家&#xff0c;满满负能量&#xff1b;可能是完美主义者&a…

HTTP协议抓包工具Charles 抓包图文完整教程

Charles是在您自己的计算机上运行的Web代理&#xff08;HTTP代理 / HTTP监视器&#xff09;&#xff0c;您的网络浏览器&#xff08;或任何其他Internet应用程序&#xff09;配置为通过Charles访问Internet&#xff0c;Charles可以为您记录并显示发送和接收的所有数据。 Http抓…

浅学指针(2)数组函数传值调用

系列文章目录 文章目录 系列文章目录前言1. 指针的使⽤和传址调⽤结论&#xff1a;实参传递给形参的时候&#xff0c;形参会单独创建⼀份临时空间来接收实参&#xff0c;对形参的修改不影响实 参。那么这个时候&#xff0c;就要搬出指针大哥&#xff0c;在main函数中将a和b的地…

bugkuctf--Crypto--抄错的字符

抄错的字符 描  述: 老师让小明抄写一段话&#xff0c;结果粗心的小明把部分数字抄成了字母&#xff0c;还因为强迫症把所有字母都换成大写。你能帮小明恢复并解开答案吗&#xff1a;QWIHBLGZZXJSXZNVBZW 这里其实是base64加密只是更换了字母大写&#xff0c;还有数字 QW…

inBuilder低代码平台新特性推荐-第十期

各位知乎的友友们&#xff0c;大家好~ 今天来给大家带来的是inBuilder低代码平台特性推荐系列第十期——查看变更日志 场景介绍 【销售订单列表】中添加查看变更日志按钮&#xff0c;可以查看列表当前行数据的历史变更记录。 运行时效果 概念 系统中有些关键业务关键数据&am…

类和对象(3)日期类的实现

日期类的实现 一&#xff0c;声明二&#xff0c;函数成员定义2.1构造函数2.2获取月份天数2.3比较运算符2.3.1等于和大于2.3.2其他 2.4计算运算符2.4.1 &&2.4.2-&&- 2.5日期-日期 一&#xff0c;声明 class Date { public:Date(int year 1, int month 1, int…

如何在没有备份的情况下恢复 iPhone 上已删除的短信

要在没有备份的情况下恢复 iPhone 上已删除的消息&#xff0c;您可以从“消息”应用程序恢复它们或使用第三方数据恢复工具。 虽然我们的 iPhone 可以做很多事情&#xff0c;但我在设备上最常做的事情之一就是文本。无论我是与朋友或家人联系&#xff0c;还是分享重要信息&…

数据结构 | 堆【图解】

数据结构 | 堆【图解】 文章目录 数据结构 | 堆【图解】堆的概念及结构堆的实现堆的初始化堆的插入【重点】堆的删除【重点】取堆顶的数据堆的数据个数堆的判空堆的销毁 全部代码 堆的概念及结构 堆&#xff08;heap&#xff09;&#xff1a; 一种有特殊用途的数据结构——用来…

【办公常识_2】设置网络优先级

1、设置网络优先级 2、切换网卡 有时候需要多张网卡来回切换 &#xff08;1&#xff09;禁用掉一张网卡 &#xff08;2&#xff09;设置网卡

发现有一个会Python的男友魅力值杠杠的!!!

Python能做什么&#xff1f; 可以做日常任务&#xff0c;比如自动备份你的MP3&#xff0c;可以做网站&#xff0c;很多著名的网站像知乎、YouTube就是Python写的&#xff0c; 可以做网络游戏的后台&#xff0c;很多在线游戏的后台都是Python开发的。 上面说的这些本人并没有实…

hdlbits系列verilog解答(Exams/m2014 q4e)-46

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路&#xff1a; 二、verilog源码 module top_module (input in1,input in2,output out);assign out ~(in1 | in2);endmodule三、仿真结果 转载请注明出处&#xff01;

你听过斯大林病毒吗?

相信不少小伙伴看过这种红眼特效&#xff0c;那么你知道这个特效最早出自哪里吗&#xff1f; 其实这个红眼病毒最早出于俄罗斯的电脑病毒斯大林&#xff0c;一旦电脑感染这个病毒&#xff0c;屏幕上就会出现自带一个红眼特效的斯大林人像&#xff0c;同时不断播放苏联国歌。 …

qgis添加arcgis的FeatureServer

左侧浏览器-ArcGIS要素服务器-新建连接 http://sampleserver6.arcgisonline.com/arcgis/rest/services/ 展开-双击即可

Python潮流周刊:Twitter 的强敌 Threads 是用 Python 开发的!

&#x1f984;文章&教程 1、聊一聊 Python 和 Golang 的垃圾回收 常见的垃圾回收算法有哪些&#xff0c;它们的优缺点是什么&#xff1f;Python 的垃圾回收机制由什么组成&#xff0c;如何解决内存泄漏问题&#xff1f;Golang 的垃圾回收机制又是怎样的&#xff0c;如何解…

搭建Linux环境 云服务器指南

我们要学习Linux的相关知识&#xff0c;必须搭建Linux环境 这里有三种方式&#xff1a; 这篇文章我们介绍一下云服务器的购买 购买云服务器 我们以腾讯云为例, 其他的服务器厂商也是类似 云服务器或轻量级应用服务器都是可以的&#xff0c;我们以轻量级应用服务器为例 1.进入…

MySQL死锁了怎么办(死锁的产生及解决方案),死锁的案例,死锁的排查,死锁的解决,如何避免死锁的发生

文章目录 MySQL死锁了怎么办&#xff08;死锁的产生及解决方案&#xff09;&#xff1f;1、 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件 2、死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁 3、死锁排查4、 如何避免死锁5、死锁的排查6、 …

AHSATA模块之AHCI HBA卡开发,结合SPEC文档和项目实际底层FW开发总结(一)

目录 一、简介二、总体架构和常用术语总结2.1 总结介绍2.2 常用术语解析 三、详细流程3.1 总结3.2 物理层详解3.3 链路层、传输层详解3.4 命令层详解 四、FW开发4.1 pcie header配置4.2 PMCAP和MSICAP配置4.3 pcie capbility配置4.4 Generic Host Control配置4.5 Port Register…

【腾讯云云上实验室】向量数据库+LangChain+LLM搭建智慧辅导系统实践

目录 一、搭建智慧辅导系统——向量数据库实践指南1.1、创建向量数据库并新建集合1.2、使用 TKE 快速部署 ChatGLM1.3、部署 LangChain PyPDFVectorDB等组件1.4、配置知识库语料1.5、基于 VectorDB LLM 的智能辅导助手 二、LLM时代的次世代引擎——向量数据库2.1、向量数据库L…

CleanMyMacX4.14.5macOS电脑系统免费清理工具

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff0c;…