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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章