实现一个简单的string类

目录

1.构造函数

2.析构函数

3.运算符重载

4.插入字符

5.插入字符串


首先,为了防止其与类里面的名字冲突,可以将其定义在一个命名空间中:

接下来,可以对其代码进行完善

定义一个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的末尾即可。

大致过程就是这样。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值