C++初阶学习第六弹------标准库中的string类_c语言返回string-CSDN博客
通过上篇我们已经学习到了string类的基本使用,这里我们就试着模拟实现一些,我们主要实现一些常用到的函数。
目录
一、string类的构造
二、string类的拷贝构造
三、string类的析构函数
四.基本的函数实现
1.reserve的函数实现
2.find函数的实现
3.push_back函数的实现
4.insert函数的实现
一、string类的构造
//为了区分标准库,我们用Stringclass String{public: String(const char* str = "") { if (str == nullptr) { assert(false); return; } _str = new char[strlen(str) + 1]; strcpy(_str, str); } void String_print() { cout << _str << endl; }private: char* _str;};int main(){ String s1("abc"); s1.String_print(); return 0;}
有一个点要注意的是在给默认参数的时候不要给"\0"或者是空格。
二、string类的拷贝构造
class String{public: String(const char* str = "") { if (str == nullptr) { assert(false); return; } _str = new char[strlen(str) + 1]; strcpy(_str, str); } String(const String& s) : _str(new char[strlen(s._str) + 1]) { strcpy(_str, s._str); } void String_print() { cout << _str << endl; }private: char* _str;};int main(){ String s1("abc"); s1.String_print(); String s2(s1); s2.String_print(); return 0;}
三、string类的析构函数
由于string类对象不管以哪个方式创建时,都需要用new来开辟空间,所以string的析构函数写法为:
~string(){if (_str){delete[]_str;_str = nullptr;_size = _capacity = 0;}}
四.基本的函数实现
1.reserve的函数实现
void string::reserve(size_t n){if (n > _capacity){char*ret = new char[n + 1];strcpy(ret, _str);_str = ret;_capacity = n + 1;}}
2.find函数的实现
size_t string::find(char ch, size_t pos){assert(pos < _size);for (size_t i = pos; pos < _size; i++){if (_str[i] == ch){return i;}}return npos;}
3.push_back函数的实现
void string::push_back(char ch){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;_size++;_str[_size] = '\0';}
4.insert函数的实现
void string::insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}int end = _size + 1;while (end > pos){_str[end] = _str[end - 1];end--;}_str[end] = ch;_size++;}