运算符进行重载的目的:
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; }