Mystring类的实现

Mystring类的定义:

#include<iostream>
using namespace std;

class Mstring
{
private:
	int _len;
	char* _str;
public:
	Mstring();
	Mstring(const Mstring& src);
	Mstring(const char* str);
	~Mstring();
	Mstring& operator=(const Mstring& src);
	Mstring& operator=(const char* str);
	Mstring operator+(const Mstring& src)const;
	Mstring operator+(const char* str)const;
	bool operator==(const Mstring& src)const;
	bool operator==(const char* str)const;
	bool operator>(const Mstring& src)const;
	bool operator>(const char* str)const;
	void operator<<(ostream& out)const;
	void operator>>(istream& in);
	char& operator*()
	{
		return *_str;
		//*s = 'a';
	}
	const char& operator*()const
	{
		return *_str;
		//*s = 'a';
	}

	char& operator[](int sit)
	{
		return _str[sit];
	}

	const char& operator[](int sit)const
	{
		return _str[sit];
	}

	int size()const
	{
		return strlen(_str);
	}
	friend Mstring operator+(const char* str, const Mstring& src);
	friend bool operator==(const char* str, const Mstring& src);
	friend bool operator>(const char* str, const Mstring& src);
	friend ostream& operator<<(ostream& out, const Mstring& src);
	friend istream& operator>>(istream& in,  Mstring& src);
};

Mstring operator+(const char* str, const Mstring& src);
bool operator==(const char* str, const Mstring& src);
bool operator>(const char* str, const Mstring& src);
ostream& operator<<(ostream& out, const Mstring& src);
istream& operator>>(istream& in, const Mstring& src);

Mystring类的实现:

1、构造和析构

Mstring::Mstring()//默认构造
{
	_len = 10;  //默认长度为10
	_str = new char[_len+1];
	memset(_str, 0, _len+1);
}

Mstring::Mstring(const Mstring& src)//拷贝构造
{
	_len = src._len;
	_str = new char[_len+1];
	memset(_str, 0, _len+1);
	strcpy_s(_str,_len+1,src._str);
}

Mstring::Mstring(const char* str)//用char*字符串的构造
{
	_len = strlen(str);
	_str = new char[_len+1];
	memset(_str, 0, _len+1);
	strcpy_s(_str, _len+1, str);
}
Mstring::~Mstring()//析构
{
	delete _str;
	_len = 0;
	_str = NULL;
}

2、等号运算符的重载

Mstring& Mstring::operator=(const Mstring& src)
{
	if (&src == this)
	{
		return *this;
	}
	delete _str;
	_len = src._len;
	_str = new char[_len+1];
	memset(_str, 0, _len+1);
	strcpy_s(_str, _len+1, src._str);
	return *this;
}

Mstring& Mstring::operator=(const char* str)
{
	delete _str;
	if (str == NULL)
	{
		_str = NULL;
		return *this;
	}
	
	_len = strlen(str);
	_str = new char[_len+1];
	memset(_str, 0, _len+1);
	strcpy_s(_str, _len+1,str);
	return *this;
}

3、加号运算符的重载

Mstring Mstring::operator+(const Mstring& src)const
{
	int len = src.size() + size() + 1;
	char* tmp = new char[len];
	memset(tmp, 0, len);
	strcpy_s(tmp,len,_str);
	strcpy_s(tmp + size(),len-size(), src._str);

	return tmp;
}
Mstring Mstring::operator+(const char* str)const
{
	int len = strlen(str) + size() + 1;
	char* tmp = new char[len];
	memset(tmp, 0, len);
	strcpy_s(tmp,len, _str);
	strcpy_s(tmp + size(),len-size(), str);
	return tmp;
}

4、比较运算符的重载

bool Mstring::operator==(const Mstring& src)const
{
	return strcmp(_str, src._str) == 0;
}
bool Mstring::operator==(const char* str)const
{
	return strcmp(_str, str) == 0;
}

bool Mstring::operator>(const Mstring& src)const
{
	return strcmp(_str, src._str) == 1;
}
bool Mstring::operator>(const char* str)const
{
	return strcmp(_str, str) == 1;
}

5、输入输出运算符的重载

void Mstring::operator<<(ostream& out)const
{
	out << _str << endl;
}
void Mstring::operator>>(istream& in)
{
	char str[1024];
	in >> str;
	delete _str;
	_len = strlen(str);
	_str = new char[_len + 1];
	strcpy_s(_str, _len + 1 ,str);
}

6、类外函数的实现:

Mstring operator+(const char* str, const Mstring& src)
{
	return Mstring(str) + src;
}

bool operator==(const char* str, const Mstring& src)
{
	return Mstring(str) == src;
}
bool operator>(const char* str, const Mstring& src)
{
	return Mstring(str) > src;
}
ostream& operator<<(ostream& out, const Mstring& src)
{
	out << src._str << endl;
	return out;
}
istream& operator>>(istream& in,Mstring& src)
{
	char str[1024];
	in >> str;
	delete src._str;
	src._len = strlen(str);
	src._str = new char[src._len + 1];
	strcpy_s(src._str, src._len + 1, str);
	return in;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值