前言:在C++中,string是一个极其重要且常用的类,它为我们提供了丰富的字符串操作功能。然而,了解其背后的实现原理,不仅可以帮助我们更好地使用它,还能让我们对C++的内存管理、模板编程等有更深入的理解。本文将带你走进C++字符串的世界,通过模拟实现一个简单的string类,来探索其内部机制
模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数
首先我们要先搞清楚string的成员变量,我们清楚string类在底层实际上就是一个字符指针,在模拟实现string之前,我们创建一个属于自己的命名空间来与库里面的区分
注意:在调用无参的构造函数时,库里面并不只是开了空间,它还干了其他事情,所以我们在自己模拟现实时,一定不能用nullptr
去初始化,否则就会出错,因此我们放一个'\0'
进去!
std::string无参构造:
在带参的构造函数因为常量字符串最后自带了一个'\0'
,因此我们什么都不用带
string的析构函数非常简单,只需要将空间用delete
释放,并且将各个指针置为空,将空间大小变为0
首先我们来看一段拷贝构造的模拟实现:
为什么会引发异常呢?
我们发现s1和s2都指向都一块空间,在释放时同一块空间是不可以被释放多次的
,从而引起了崩溃,而这就是浅拷贝!
浅拷贝: 也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规,
可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享
深拷贝:每个对象都有一份独立的资源,不要和其他对象共享
注意: 关于浅拷贝一定要引起重视!
operator=
在operator=
上,我们有两种写法
传统写法
现代写法
operator<, operator==
关于比较我们就讲这两个,对于其他的都可用operator<, operator==
去进行推导!
size,capacity,resize,reverse
size,capacity这两个函数的模拟实现相对简单,我们简单实现一下就可以
reverse只会改变capacity的大小,并不会改变size的大小
resize与reserve类似会改变size大小,但是也会改变capacity大小
因为在添加中+=既可以添加字符也可以添加字符串,往往在日常中的使用频率是最高的,所以推荐大家使用+=来代替
push_back
和append
经过对STL中string的深入探索与模拟实现,我们仿佛揭开了一个隐藏在C++深处的奇妙世界。这个旅程不仅让我们对string这一基础数据类型有了更为深刻的理解,也让我们领略了STL背后的设计理念与精巧实现,让我们携手共进,共同走进C++字符串的奇妙世界! 谢谢大家支持本篇到这里就结束了,祝大家天天开心!