[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调

这篇具有很好参考价值的文章主要介绍了[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调,C++,c++,开发语言

1、string类的出现

1.1 C语言中的字符串

C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
因此C++中,为了让我们更简单、方便、快捷的使用字符串类型,C++提供了string类。

2、标准库中的string类

2.1 string类

string类文档介绍
string类在使用的时候我们需要包含头文件 #include ,以及using namespace std;

  1. 字符串是表示字符序列的类。
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:
1. string是表示字符串的字符串类。
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
3. string在底层实际是:basic_string模板类的别名,
typedef basic_string<char, char_traits, allocator>string;
4. 不能操作多字节或者变长字符的序列。

3、string类的常见接口说明及模拟实现

3.1 string的常见构造

(constructor)函数名称 功能说明
string() 构造空的string类对象,即空字符串
string(const char* s) 用C-string来构造string类对象
string(size_t n, char c) string类对象中包含n个字符c
string(const string&s) 拷贝构造函数
int main()
{
	string s1; // 构造空的string类对象s1
	string s2("hello"); // 用C格式字符串构造string类对象s2
	string s3(s2); // 拷贝构造s3

	return 0;
}

3.2 string的构造函数

namespace s
{
	class string
	{
	public:
    	//string()
		//	:_str(new char[1]{ '\0' })//这里开一个空间,并赋值为\0,如果直接赋值为nullptr的话
		//	,_size(0)				  //在实例化一个无参对象后,对对象进行操作的时候会引发空指针异常
		//	,_capacity(0)
		//{}
    
		//全缺省构造函数
		string(const char* str = "")//常量字符串默认以\0结尾,因此不需要给
			: _size(strlen(str))
			, _capacity(_size)
		{
			_str = new char[_capacity + 1];//多开一个空间,需要存放\0
			strcpy(_str, str);//将字符串拷贝到_str
		}

	private:
		char* _str;
		size_t _size;//有效存储字符个数
		size_t _capacity;//实际空间
	};
}

这里我们用一个全缺省将无参构造与构造都包括了。
这个构造函数很简单,这里就不多讲了,大家应该可以看懂。

3.3 string的拷贝构造

传统写法:

//拷贝构造
string(const string& s)
    : _size(strlen(s._str))
    , _capacity(_size)
{
    _str = new char[_capacity + 1];
    strcpy(_str, s._str);
}

现代写法:

void swap(string& s)
{
    std::swap(_str, s._str);
    std::swap(_size, s._size);
    std::swap(_capacity, s._capacity);
}
//现代写法 s1(s2)
string(const string& s)
    :_str(nullptr)
    ,_size(0)
    ,_capacity(0)
{
    string tmp(s._str);//构造
    swap(tmp);//this->swap(s);
}

库里提供了交换函数,我们封装一个交换函数,内部的实现就使用库里面的swap,我们拷贝构造函数里面先调用构造函数,实例化一个tmp,再将tmp与this交换。

3.4 string的赋值构造

传统写法:

string& operator=(const string& s)
{
	if (this != &s)
	{
		string tmp(s);//拷贝构造
		swap(tmp);
	}
	return *this;
}

现代写法:这里与拷贝构造的现代写法是类似的,不再多说。

void swap(string& s)
{
    std::swap(_str, s._str);
    std::swap(_size, s._size);
    std::swap(_capacity, s._capacity);
}
string& operator=(const string& s)
{
    if (this != &s)
    {
        string tmp(s);//拷贝构造
        swap(tmp);
    }
    return *this;
}

我们其实可以对现代写法继续精简一下,我们这里参数是引用传参,我们不用引用就会产生一次拷贝,对拷贝的形参直接进行交换,这样就可以简化写法,但是这里的效率其实是一样的,都是一次拷贝构造 + 一次交换。文章来源地址https://www.toymoban.com/news/detail-657860.html

// 极致写法,效率与上面一样
string& operator=(string tmp)//参数直接调用拷贝构造
{
    swap(tmp);

    return *this;
}

4、完整代码

#include <string.h>
#include <algorithm>
using namespace std;

namespace s
{
	class string
	{
	public:
		//string()
		//	:_str(new char[1]{ '\0' })//这里开一个空间,并赋值为\0,如果直接赋值为nullptr的话
		//	,_size(0)				  //在实例化一个无参对象后,对对象进行操作的时候会引发空指针异常
		//	,_capacity(0)
		//{}

		//全缺省构造函数
		string(const char* str = "")//常量字符串默认以\0结尾,因此不需要给
			:_size(strlen(str))
			,_capacity(_size)
		{
			_str = new char[_capacity + 1];//多开一个空间,需要存放\0
			strcpy(_str, str);//将字符串拷贝到_str
		}

		//拷贝构造
		// 传统写法
		//string(const string& s)
		//	:_size(s._size)
		//	,_capacity(s._capacity)
		//{
		//	_str = new char[s._capacity + 1];
		//	strcpy(_str, s._str);
		//}

		void swap(string& s)
		{
			std::swap(_str, s._str);
			std::swap(_size, s._size);
			std::swap(_capacity, s._capacity);
		}
		//现代写法 s1(s2)
		string(const string& s)
			:_str(nullptr)
			,_size(0)
			,_capacity(0)
		{
			string tmp(s._str);//构造
			swap(tmp);//this->swap(s);
		}

		//赋值
		// 传统写法
		//string& operator=(const string& s)
		//{
		//	if (this != &s)
		//	{
		//		char* tmp = new char[s._capacity];
		//		strcpy(tmp, s._str);

		//		delete[] _str;
		//		_str = tmp;//将tmp字符串直接给_str,类似浅拷贝
		//		_size = s._size;
		//		_capacity = s._capacity;
		//	}

		//	return *this;
		//}

		//现代写法
		//string& operator=(const string& s)
		//{
		//	if (this != &s)
		//	{
		//		string tmp(s);//拷贝构造
		//		swap(tmp);
		//	}
		//	return *this;
		//}
		// 极致写法,效率与上面一样
		string& operator=(string tmp)//参数直接调用拷贝构造
		{
			swap(tmp);

			return *this;
		}

		~string()
		{
			cout << "~string()" << endl;
			delete[] _str;
			_size = _capacity = 0;
		}

	private:
		char* _str;
		size_t _size;//有效存储字符个数
		size_t _capacity;//实际空间
	};
}

到了这里,关于[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 之 string类的模拟实现

    这学习我有三不学 昨天不学,因为昨天是个过去 明天不学,因为明天还是个未知数 今天不学,因为我们要活在当下,我就是玩嘿嘿~ –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

    2024年04月27日
    浏览(31)
  • 【C++初阶】9. string类的模拟实现

    string类的完整实现放这里啦!快来看看吧 string类的作用就是将字符串类型实现更多功能,运算符重载,增删改查等等操作,所以其成员就包含char*的字符串 在之前的学习过程中,我们了解到类中存在的六个默认函数,其中就包含默认构造函数,那么对于string类是否需要用户自

    2024年02月09日
    浏览(35)
  • 【C++初阶】学习string类的模拟实现

    前面已经学习了string类的用法,这篇文章将更深入的学习string类,了解string类的底层是怎么实现的。当然,这里只是模拟一些常用的,不常用的可以看文档学习。 我们一共创建两个文件,一个是test.cpp文件,用于测试;另一个是string.h文件,用于声明和定义要模拟的string类。

    2024年02月03日
    浏览(53)
  • 【c++】string类的使用及模拟实现

    我们先了解一下什么是OOP思想 OOP思想,即面向对象编程(Object-Oriented Programming)的核心思想,主要包括“抽象”、“封装”、“继承”和“多态”四个方面。 抽象:抽象是忽略一个主题中与当前目标无关的那些方面,以便充分地注意与当前目标有关的方面。抽象并不打算了

    2024年04月11日
    浏览(35)
  • 【C++初阶】第八站:string类的模拟实现

    目录 string类的模拟实现 经典的string类问题 浅拷贝 深拷贝 写时拷贝(了解) 构造函数 string的全缺省的构造函数: string的拷贝构造函数 传统写法 现代写法 string的赋值重载函数 传统写法 现代写法 string的无参构造函数: 遍历函数 operator[ ] 迭代器 迭代器的底层实现begin和end:

    2024年04月28日
    浏览(39)
  • STL中的string类的模拟实现【C++】

    构造函数设置为缺省参数,若不传入参数,则默认构造为空字符串。字符串的初始大小和容量均设置为传入C字符串的长度(不包括’\\0’) 在模拟实现拷贝构造函数前,我们应该首先了解深浅拷贝: 浅拷贝:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一

    2024年02月15日
    浏览(41)
  • 【C++初阶】STL详解(二)string类的模拟实现

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 注:为了防止与标准库当中的string类产生命名冲

    2024年02月05日
    浏览(57)
  • 【C++】深度剖析string类的底层结构及其模拟实现

    在上两篇中,我们已经学习了string类的一个使用,并且做了一些相关的OJ练习,相信大家现在对于string的使用已经没什么问题了。 那我们这篇文章呢,就来带大家对string进行一个模拟实现,这篇文章过后,有些地方大家或许就可以理解的更深刻一点。 那通过之前文章的学习我

    2023年04月17日
    浏览(106)
  • 【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 我们模拟vector是用迭代器(start,end,endofstorage)来控制增删查改操作的 1普通构造 2迭代器构造 3初始化字符构造 4拷贝构造: 1当前大小(size()) 2总体容量(capacity()) 1begin()

    2024年02月15日
    浏览(60)
  • 【C++练级之路】【Lv.6】【STL】string类的模拟实现

    欢迎各位小伙伴关注我的专栏,和我一起系统学习C语言,共同探讨和进步哦! 学习专栏 : 《进击的C++》 关于 STL容器 的学习,我会采用 模拟实现 的方式,以此来更加清楚地了解其 底层原理和整体架构 。而string类更是有100多个接口函数,所以模拟实现的时候只会调重点和

    2024年01月18日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包