C++初阶学习第六弹------标准库中的string类_c语言返回string-CSDN博客
通过上篇我们已经学习到了string类的基本使用,这里我们就试着模拟实现一些,我们主要实现一些常用到的函数。
目录
一、string类的构造
二、string类的拷贝构造
三、string类的析构函数
四.基本的函数实现
1.reserve的函数实现
2.find函数的实现
3.push_back函数的实现
4.insert函数的实现
一、string类的构造
//为了区分标准库,我们用String
class 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++;
}