c++运算符重载(四)

运算符进行重载的目的:

C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。

 

C++运算符重载的实质:

运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函数来完成不同的基本操作。要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数形式:operatorp(argument-list)//operator 后面的'p'为要重载的运算符符号。

头文件:

#ifndef _MYSTRING_H
#define _MYSTRING_H
#include<iostream>
#include<cstring>

using namespace std;

class Mystring
{
private:
	int m_length;
	char *m_data;
	
public:
	Mystring();
	Mystring(char *str);
	Mystring(int a,char ch);
	Mystring(const Mystring &s);
	
	//重载<< >>运算符,实现为全局函数
	friend ostream &operator <<(ostream &out,const Mystring &s);
	friend istream &operator >>(istream &in, Mystring &s);
	
	//重载=运算符
	Mystring &operator = (char *str);
	Mystring &operator = (const Mystring &s);
	
	char &operator [] (int index);
	//重载== !=运算符
	bool operator ==(char *str);
	bool operator ==(const Mystring &s);
	bool operator !=(char *str);
	bool operator !=(const Mystring &s);
	
	Mystring &operator + (char *str);
	Mystring &operator + (const Mystring &s);
	Mystring &operator += (char *str);
	Mystring &operator += (const Mystring &s);
	
	bool operator > (char *str);
	bool operator > (const Mystring &s);
	bool operator < (char *str);
	bool operator < (const Mystring &s);
};

#endif

成员函数定义:
 
 
#include"mystring.h"

using namespace std;
Mystring::Mystring()
{
	m_length = 0;
	m_data = NULL;
}

Mystring::Mystring(char *str)
{
	m_length = strlen(str);
	
	m_data = new char[m_length+1];
	strcpy(m_data,str);
	m_data[m_length] = '\0';
}

Mystring::Mystring(int a,char ch)
{
	m_length = a;
	m_data = new char[m_length+1];
	for(int i=0;i<m_length;i++)
	{
		m_data[i] = ch;
	}
	m_data[m_length] = '\0';
}

Mystring::Mystring(const Mystring &s)
{
	m_length = s.m_length;
	m_data = new char [m_length+1];
	strcpy(m_data,s.m_data);
	m_data[m_length] = '\0';
}


 ostream &operator <<(ostream &out,const Mystring &s)
 {
	 out<<s.m_data;
	 return out;
 }
 
 istream &operator >>(istream &in, Mystring &s)
 {
	 char tmp[100] = {0};
	 in >> tmp;
	 
	 s.m_length = strlen(tmp);
	 s.m_data = new char[s.m_length+1];
	 strcpy(s.m_data,tmp);
	 s.m_data[s.m_length] = '\0';
	 return in;
 }
 
 Mystring& Mystring::operator = (char *str)
 {
	 m_length = strlen(str);
	 if(m_data!=NULL)
	 {
		 delete [] m_data;
	 }
	 m_data = new char[m_length + 1];
	 strcpy(m_data,str);
	 m_data[m_length] = '\0';
	 return *this;
 }
 Mystring & Mystring::operator = (const Mystring &s)
 {
	 m_length = s.m_length;
	 strcpy(m_data,s.m_data);
	 return *this;
 }
 char & Mystring::operator [] (int index)
 {
	 return m_data[index];
 }
 
Mystring & Mystring::operator + (char *str)
{
	char *tmp = m_data;
	
	m_length = m_length + strlen(str);
	m_data =new char[m_length+1];
	strcpy(m_data,tmp);
	strcat(m_data,str);
	delete [] tmp;
	return *this;
}

Mystring & Mystring::operator + (const Mystring &s)
{
	//*this = *this +s.m_data;
	char *tmp = m_data;
	
	m_length = m_length + s.m_length;
	m_data =new char[m_length+1];
	strcpy(m_data,tmp);
	strcat(m_data,s.m_data);
	delete [] tmp;
	return *this;
}

Mystring & Mystring::operator += (char *str)
{
	char *tmp = m_data;
	/*if(m_data!=NULL)
	{
		delete [] m_data;
	}*/
	
	m_length = m_length + strlen(str);
	m_data =new char[m_length+1];
	strcpy(m_data,tmp);
	strcat(m_data,str);
	delete [] tmp;
	return *this;
}

Mystring & Mystring::operator += (const Mystring &s)
{
	//*this = *this +s.m_data;
	char *tmp = m_data;
	/*if(m_data!=NULL)
	{
		delete [] m_data;
	}*/
	
	m_length = m_length + s.m_length;
	m_data =new char[m_length+1];
	strcpy(m_data,tmp);
	strcat(m_data,s.m_data);
	delete [] tmp;
	return *this;
}

bool Mystring::operator ==(char *str)
{
	if(strcmp(m_data,str))
	{
		return false;
	}
	else
		return true;
}

bool Mystring::operator ==(const Mystring &s)
{
	if(strcmp(m_data,s.m_data))
	{
		return false;
	}
	else
		return true;
}

bool Mystring::operator !=(char *str)
{
	if(strcmp(m_data,str))
	{
		return true;
	}
	else
		return false;
}

bool Mystring::operator !=(const Mystring &s)
{
	if(!strcmp(m_data,s.m_data))
	{
		return false;
	}
	else
		return true;
}

bool Mystring::operator >(char *str)
{
	if(strcmp(m_data,str)>0)
	{
		return true;
	}
	else
		return false;
}

bool Mystring::operator >(const Mystring &s)
{
	if(strcmp(m_data,s.m_data)>0)
	{
		return true;
	}
	else
		return false;
}

bool Mystring::operator <(char *str)
{
	if(strcmp(m_data,str)<0)
	{
		return true;
	}
	else
		return false;
}

bool Mystring::operator <(const Mystring &s)
{
	if(strcmp(m_data,s.m_data)<0)
	{
		return true;
	}
	else
		return false;
}
主函数: 
 
#include"mystring.h"

using namespace std;
int main()
{
	Mystring s1("hello");
	Mystring s2(10,'a');
	Mystring s3(s2);
	
	cout<<"s1="<<s1<<endl;
	cout<<"s2="<<s2<<endl;
	cout<<"s3="<<s3<<endl;
	
	s1 = "abcdefg";
	cout<<"s1="<<s1<<endl;
	cout<<"s2="<<s2<<endl;
	cout<<s1[1]<<endl;
	
	Mystring s4="wang";
	
	s4 = s4 + "ab";
	cout<<"s4 = "<<s4<<endl;
	
	s4+=s1;
	cout<<"s4+="<<s4<<endl;
	
	Mystring s5="wangsb";
	if(s4==s5)
	{
		cout<<"equal"<<endl;
	}
	else
		cout<<"not equal"<<endl;
	
	if(s1!=s4)
	{
		cout<<"not equal"<<endl;
	}
	else
		cout<<"equal"<<endl;
	
	//s4+=s1;
	//cout<<"s4+="<<s4<<endl;
	
	if(s4 > s5)
	{
		cout<<"大于"<<endl;
	}
	else
		cout<<"不大于"<<endl;
	
	return 0;
}




猜你喜欢

转载自blog.csdn.net/chenlj_1/article/details/79913515