14. MyString 类的操作符重载

 class String
{
	//重载 ‘<< >>’ 操作符
	//声明为友元类,并返回ostream&,达到链式的作用
	friend ostream& operator<< (ostream &output, String &s);
	friend istream& operator>> (istream &input, String &s);
private:
	int m_len;
	char *m_str;
public:
	//构造函数
	String(int len = 0);
	String(const char *str);
	String(const String &s);
	~String();
public:
	//操作符重载
	char& operator[](int index);
	String& operator=(const char *str);
	String& operator=(const String &s);
	bool operator==(const String &s)const;
	bool operator==(const char *str)const;
	bool operator!=(const String &s)const;
	bool operator!=(const char *str)const;
	int operator>(const String &s)const;
	int operator<(const String &s)const;
	int operator>(const char *str)const;
	int operator<(const char *str)const;
public:
	//把类的指针露出来
	char *c_str()
	{
		return m_str;
	}
	const char *c_str1()
	{
		return m_str;
	}
	int length()
	{
		return m_len;
	}
};
//重载 << >>操作符
ostream& operator << (ostream &output, String &s)
{
	output << s.m_str;
	return output;
}
istream& operator >> (istream &input, String &s)
{
	input >> s.m_str;
	return input;
}
//构造函数
String::String(int len)
{
	if (len == 0)
	{
		m_len = len;
		m_str = new char[m_len + 1];
		*m_str = '\0';
	}
	else if (len > 0)
	{
		m_len = len;
		m_str = new char[m_len + 1];
		memset(m_str, 0, m_len);
	}
}
//构造函数
String::String(const char *str)
{
	if (str == NULL)
	{
		m_len = 0;
		m_str = new char[m_len + 1];
		*m_str = '\0';
	}
	else
	{
		m_len = strlen(str);
		m_str = new char[m_len + 1];
		memcpy(m_str, str, m_len + 1);
	}
}
//拷贝构造函数
String::String(const String &s)
{
	m_len = s.m_len;
	m_str = new char[m_len + 1];
	memcpy(m_str, s.m_str, m_len + 1);
}
//析构函数
String::~String()
{
	if (m_str != NULL)
	{
		delete[] m_str;
		m_str = NULL;
		m_len = 0;
	}
}
//重载 = 操作符 char *str
String& String::operator=(const char *str)
{
	//释放旧内存
	if (m_str != NULL)
	{
		delete[] m_str;
		m_str = NULL;
		m_len = 0;
	}
	//根据str分配内存
	if (str == NULL)
	{
		m_len = 0;
		m_str = new char[m_len + 1];
		*m_str = '\0';
	}
	else
	{
		m_len = strlen(str);
		m_str = new char[m_len + 1];
		memcpy(m_str, str, m_len + 1);
	}
	return *this;
}
 //重载 = 操作符 String &s
String& String::operator=(const String &s)
{
	//释放旧内存
	if (m_str != NULL)
	{
		delete[] m_str;
		m_str = NULL;
		m_len = 0;
	}

	m_len = strlen(s.m_str);
	m_str = new char[m_len + 1];
	memcpy(m_str, s.m_str, m_len + 1);

	return *this;
}
 //重载 [] 操作符
char& String::operator[](int index)
{
	return m_str[index];
}
 
 //重载 == 操作符
bool String::operator==(const String &s)const
{
	if (m_len != s.m_len)
	{
		return false;
	}
	if (strcmp(m_str, s.m_str) == 0)
	{
		return true;
	}
	return false;
}
bool String::operator==(const char *str)const
{
	//随时记住指针为NULL的情况
	if (str == NULL)
	{
		if (m_len == 0)
		{
			return true;
		}
		return false;
	}
	//长度不相等,返回false
	if(m_len != strlen(str))
	{
		return false;
	}
	else if (strcmp(m_str, str) == 0)
	{
		return true;
	}
	return false;
}
 //重载 != 操作符
bool String::operator!= (const String &s)const
{
	return !(*this == s);
}
bool String::operator!= (const char *str)const
{
	return !(*this == str);
}
 //重载 > < 操作符
int String::operator> (const String &s)const
{
	return strcmp(m_str, s.m_str);
}
int String::operator< (const String &s)const
{
	return strcmp(s.m_str, m_str);
}

 //重载 > < 操作符
int String::operator> (const char *str)const
{
	return strcmp(m_str, str);
}
int String::operator< (const char *str)const
{
	return strcmp(str, m_str);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值