【C++】string类模拟实现:探索其内部机制

慈云数据 2024-05-30 技术支持 33 0

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

在这里插入图片描述

💥个人主页:大耳朵土土垚的博客

💥 所属专栏:C++入门至进阶

这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖

1.string类基本框架

通过对string类的学习,我们知道string类的模拟实现最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数,以下是对模拟实现string类变量以及函数的封装:

为了防止与库里面string类名字重复,我们将自己模拟实现的string类放在tutu的命名空间中(名字可以自定义),这样使用时就不会冲突了;其次对于string类的模拟实现我们采用声明与定义分离,方便大家查看string类中包含哪些函数;如下是对string类的声明:

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
namespace tutu	//命名空间,可自定义名字
{
	class string	//定义string类
	{
	public:
		//string();		//构造函数
		string(const char* str = "");
		string(const string& s);
		//赋值运算符重载
		string& operator=(const string& s);
		//析构函数
		~string();
		typedef char* iterator;	//定义迭代器
		typedef const char* const_iterator;//常量使用的迭代器
		iterator begin();	
		iterator end();
		const_iterator begin() const;
		const_iterator end() const;
		//获取字符串指针
		const char* c_str() const;	
		
		//获取string类的容量
		size_t size() const;
		size_t capacity()const;
		//[]重载
		char& operator[](size_t pos);	
		const char& operator[](size_t pos) const;	//常量版本
		//空间操作
		void reserve(size_t n);	//预留空间
		void resize(size_t n, char ch = '\0');//重设空间大小
		bool empty()const;//判断字符串是否为空
		void clear();//清空字符串
		//尾插操作
		void push_back(char ch);//尾插字符
		void append(const char* str);//插入字符串
		//+=重载
		string& operator+=(char ch);//尾插字符
		string& operator+=(const char* str);//尾插字符串
		//在pos位置插入
		void insert(size_t pos, char ch);
		void insert(size_t pos, const char* str);
		//删除pos位置的值
		void erase(size_t pos = 0, size_t len = npos);
		//查找字符/字符串
		size_t find(char ch, size_t pos = 0);
		size_t find(const char* str, size_t pos = 0);
		//交换
		void swap(string& s);
		//截取字符串
		string substr(size_t pos = 0, size_t len = npos);
		//运算符重载
		bool operator(const string& s) const;
		bool operator=(const string& s) const;
		bool operator==(const string& s) const;
		bool operator!=(const string& s) const;
	private:
		// char _buff[16];
		char* _str = nullptr;
		size_t _size = 0;
		size_t _capacity = 0;
		const static size_t npos = -1;
	};
	
	//流插入提取重载
	istream& operator>> (istream& is, string& str);
	ostream& operator
     size_t len = strlen(str);	//计算字符串长度
     _str = new char[len + 1];	//开辟空间
     _size = _capacity = len;	//设置capacity和size值
     strcpy(_str, str);			//拷贝字符串
 }

	_str = new char[s._capacity + 1];
	strcpy(_str, s._str);
	_size = s._size;
	_capacity = s._capacity;
}

	if (this != &s)
	{
		char* tmp = new char[s._capacity + 1];
		strcpy(tmp, s._str);
		delete[] _str;
		_str = tmp;
		_size = s._size;
		_capacity = s._capacity;
	}
	return *this;
	}

    delete[] _str;
    _str = nullptr;
    _capacity = _size = 0;
}

	void Test1()
	{
		tutu::string s1 = "hello";
		tutu::string s2(s1);
		tutu::string s3 = s1;
	}
	
}

    return _str;	//返回字符串指针
}
string::iterator string::end()
{
    return _str + _size;	//返回字符串指向'\0'的指针,也就是最后一个元素的下一个
}

    return _str;
}
string::const_iterator string::end() const
{
    return _str + _size;
}

    return _str;
}

        return _size;
    }

        return _capacity;
    }

    assert(pos 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon