目录
首先,为了防止其与类里面的名字冲突,可以将其定义在一个命名空间中:
接下来,可以对其代码进行完善
定义一个string类,在里面实现一些基本的函数
namespace GGbond
{
class string
{
public:
private:
char* _str;
size_t _size;
size_t _capacity;
};
}
public:实现一些函数
1.构造函数
string(const char* str = "")
{
_size = strlen(str);
_capacity = _size;
_str = new char[_capacity + 1];
strcpy(_str, str);
}
求出字符串的容量,然后为其开一个同样大小的空间,将所给的字符串传给_str。
对于这里开空间为什么是_capacity+1,对于“abc”可得出大小为3,但是字符串还存在一个'\0',所以在开空间时必须多开一个。
这里注意默认的缺省值得给"",如果直接给nullptr,在开空间时strlen一个nullptr就会出问题。
2.析构函数
对于析构函数,就比较简单了.
~string()
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
析构只需将开的空间delete,然后将其置空,把_size,_capacity置为0即可。
接下来四个函数,分别为求大小,容量以及对应位置的值(分为const和非const)
size_t size() const
{
return _size;
}
size_t capacity() const
{
return _capacity;
}
char& operator[](size_t i)
{
assert(i < _size);
return _str[i];
}
const char& operator[](size_t i) const
{
assert(i < _size);
return _str[i];
}
3.运算符重载
string& operator=(const string& s)
{
if (this != &s)
{
char* tmp = new char[strlen(s._str) + 1];
strcpy(tmp, s._str);
delete[] _str;
_str = tmp;
_size = _capacity = strlen(s._str);
}
return *this;
}
这里,先进行一个判断,如果左右两个值相等,则无需进行赋值。
首先开辟一个临时空间tmp,然后把值s,_str赋进去,然后delete原来的内存空间_str,防止内存泄漏,最后把开的内存空间给_str。
string& operator+=(const char ch)
{
if (_size == _capacity)
{
size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;
char* tmp = new char[newcapacity + 1];
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = newcapacity;
}
_str[_size] = ch;
_size++;
_str[_size] = '\0';
return*this;
}
对于+=运算符,需要先判断是否增容,具体方法与下面插入字符。
4.插入字符
void push_back(char ch)
{
if (_size == _capacity)
{
size_t newcapacity = capacity == 0 ? 2 : _capacity * 2;
char* tmp = new char[newcapacity + 1];
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = newcapacity;
}
_str[_size++] = ch;
_str[_size] = '\0';
}
先进行空间容量的检查,如果大小与容量相等,则需要进行增容。
这里必须先进行判断,如果空间大小为0,可以先给他2个空间,否则就将空间增加为原来的2倍。和上面一样,开一个临时空间tmp,将_str的值拷贝到tmp中,然后将原来的_str进行 delete,最后把新开的空间给_str,容量变为newcapacity。
然后就可以将字符插入进去了。
5.插入字符串
与上面插入字符不同的是,插入字符串就不能进行简单的判断了,因为你不能确定你所插入的字符串的大小
void append(const char* str)
{
size_t len = strlen(str);
if (_size + len > _capacity)
{
char* tmp = new char[_size + len + 1];
strcpy(tmp, _str);
delete[] _str;
_str = tmp;
_capacity = _size + len;
}
strcpy(_str + _size, str);
_size += len;
}
这里首先判断一下,如果字符串加上要插入字符串的大小大于容量,则需要进行增容。
接下来就与上方插入字符类似,拷贝原字符_str到所开空间tmp上,delete[] _str,然后再把tmp给_str。接下来就把str拷到_str的末尾即可。
大致过程就是这样。