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