C++学习笔记 lesson11 MyString类讲解

实现String类

#ifndef  _MYSTRING_H_
#define _MYSTRING_H_
#include<limits>
#include<cstring>

namespace PoEdu {


	class MyString
	{
	public:
		static const std::size_t npos = -1;
		MyString(const char* str = "") :max_size_(UINT_MAX)
		{
			str_ = Alloc(str);
		};
		MyString(const MyString& other) :max_size_(UINT_MAX)
		{
			str_ = Alloc(other.str_);
		}
		MyString(const char* str, unsigned int len) :max_size_(UINT_MAX)
		{
			int str_len = strlen(str);
			str_ = new char[len + sizeof(char)];
			memset(str_, 0, len + sizeof(char));
			length_ = len;
			for (unsigned int i = 0; i < str_len; ++i)
			{
				str_[i] = str[i];
				if (i == len)
					break;
			}
		}
		MyString(unsigned int len, const char c) :max_size_(UINT_MAX)
		{
			str_ = new char[len + sizeof(char)];
			memset(str_, 0, len + sizeof(char));
			length_ = len;
			for (unsigned int i = 0; i < len; ++i)
			{
				str_[i] = c;
			}

		}
		MyString(const MyString&other, std::size_t pos, std::size_t len = MyString::npos) :max_size_(UINT_MAX)
		{
			if (len == npos)
				length_ = other.length_ - pos;
			else
				length_ = len;
			str_ = new char[length_ + sizeof(char)];
			for (unsigned int i = pos; i < length_ + pos; ++i)
			{
				str_[i - pos] = other.str_[i];
			}
		}
		MyString(const char *first, const char *last) :max_size_(UINT_MAX)
		{
			length_ = (last - first);//区间长度
			//指针计算出来的是地址偏移的值
			str_ = new char[length_ + sizeof(char)];
			memset(str_, 0, length_ + sizeof(char));
			memcpy(str_, first, length_);
		}
		~MyString()
		{
			delete[] str_;
		};
		char* begin()const
		{
			return str_;
		}
		char *end()const
		{
			return &(str_[length_ + 1]);//最后一个元素+1的位置 '/0'之后,未维护的值
		}
		char* rbegin()const
		{
			return end();
		}
		char *rend()const
		{
			return begin();
		}

		MyString&operator =(const MyString &str) 
		{
			if (this != &str)//判断是否是自身
			{	//深拷贝
				delete[]str_;//是自身的话会被删除,引发错误
				str_ = Alloc(str.str_);
				return *this;
			}
		}
		MyString&operator =(const char *s)
		{
			delete[]str_;
			str_ = Alloc(s);
			return *this;
		}
		MyString&operator =(char c)
		{
			delete[]str_;
			length_ = 1;
			str_ = new char[length_ + sizeof(char)];
			memset(str_, 0, length_ + sizeof(char));
			str_[0] = c;
			return *this;
		}
		unsigned int size()const
		{
			return length_;
		}
		unsigned int length()const
		{
			return length_;
		}
		void resize(unsigned int len)
		{
			length_ = len;
			char *temp = new char[len + sizeof(char)];//扩容
			memset(temp, 0, len + sizeof(char));
			strcpy(temp, str_);
			delete[]str_;
			str_ = temp;
		}
		void resize(unsigned int len, char c)
		{
			unsigned int length = length_;
			resize(len);
			for (; length_ < len; ++length)
			{
				str_[length_] = c;
			}
		}
		bool empty()const
		{
			return !length_;
		}
		char &operator[](unsigned int index)
		{
			return const_cast<char&>(static_cast<const MyString&>(*this)[index]);
		}
 		 const char &operator[](unsigned int index) const
		{
			 return str_[index];
		}
		 char & at(unsigned int index)
		 {
			 return const_cast<char&>(static_cast<const MyString&>(*this).at[index]);
		 }
		 const char &at(unsigned int index) const
		 {
			 int temp = index;
			 if (index >= length_)
			 {
				 //printf("超出范围");
				 temp = length_;
			 }
			 return str_[temp];
		 }
		 MyString &operator+=(const MyString &other)
		 {
			 return this->operator+=(other.str_);
		 }
		 MyString &operator+=(const char *s)
		 {
			 length_ += strlen(s);
			 char *temp = new char[length_ + sizeof(char)];
			 memset(temp, 0, length_ + sizeof(char));
			 strcpy(temp, str_);
			 strcat(temp, s);
			 delete[]str_;
			 str_ = temp;
			 return *this;
		 }
		 MyString &operator+=(char c)
		 {
			 char temp[2] = { 0 };
			 temp[0] = c;
			 return this->operator+=(temp);
		 }
		 friend MyString operator+(const MyString&lhs, const MyString&rhs)
		 {
			  
			 return MyString(lhs)+=rhs;
		 }
		 friend MyString operator+(const MyString&lhs, const  char*rhs)
		 {
			  
			 return MyString(lhs)+=rhs;
		 }
		 friend MyString operator+(const char*lhs, const MyString&rhs)
		 {
			 return MyString(lhs) += rhs;
		 }
		 friend MyString operator+(const MyString&lhs, char rhs)
		 {
			 return MyString(lhs) +=  rhs ;
		 }
		 friend MyString operator+(char lhs, const MyString&rhs)
		 {
			 char temp[2] = { 0 };
			 temp[0] = lhs;
			 return MyString(temp) += rhs;
		 }
	private:
		char *str_;
		unsigned int length_;//当前长度
		const int max_size_; //最大长度
		char *Alloc(const char*data)
		{
			length_ = strlen(data);
			char *temp = new char[length_ + sizeof(char)];
			strcpy(temp, data);
			return temp;
		}
	};
}
#endif // ! _MYSTRING_H_


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值