C++初阶学习第七弹——string的模拟实现

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

猜你喜欢

转载自blog.csdn.net/2302_81257639/article/details/143026813