从构造,析构以及拷贝构造的方面理解string类的底层实现。
源代码获取:
https://github.com/akh5/C-/blob/master/STL/Mystring.cpp
string的底层通过字符指针char*通过构造函数申请对应大小的空间,并将指针指向其空间。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
namespace my
{
class string
{
public:
string(char* str = "")
{
if (nullptr == str)
str = "";
//申请空间
_str = new char[strlen(str)+1]; //“\0”
strcpy(_str, str);
}
~string()
{
if (_str)
{
delete[] _str;
_str = nullptr;
}
}
private:
char* _str;
};
}
构造时需要先给一个默认为空的字符粗,对应string str没=没有初始化的情况。构造函数中,需要人为申请一段比str多1的空间,可以放置str中的内容和一个’\0’。将_str指向申请的空间,用strcpy函数将str的内容赋值给_str。
析构函数将开始申请的空间释放掉,并将_str指向空指针就完成析构
拷贝构造
深拷贝和浅拷贝概念的引入:https://blog.csdn.net/MPF1230/article/details/104023364
浅拷贝的实现相对简单,编译器默认的拷贝构造也是浅拷贝,但是浅拷贝的危害是,拷贝的对象结束调用析构函数时,会导致空间的二次释放
namespace my
{
class string
{
public:
string(char* str = ""</