運算符進行重載的目的:
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;
}