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++;
}