c语言中,运算符的操作数只支持基本数据类型,而c++中操作数可以扩展支持复合数据类型,这就要通过运算符重载来实现。我们可以把运算符看作一个函数名,通过函数重载的方式为同一个运算符实现不同规则的运算,所以运算符重载的本质就是函数重载。运算符重载和普通函数重载的唯一区别就是函数名,运算符重载的函数名是由关键字operator和其后要重载的运算符符号构成的,在形式上比普通函数名复杂一些。
下面是一些具体代码。通过运算符重载,实现类的对象之间直接赋值,相加,比较大小等。
头文件string.h
#ifndef _MYSTRING_H
#define _MYSTRING_H
#include <iostream>
using namespace std;
class String
{
//重载<< >> 注意插入提取运算符只能重载为友元函数
friend ostream &operator <<(ostream &out, const String &s);
friend istream &operator >>(istream &in, String &s);
private:
int m_length;
char *m_data;
public:
String();
String(char *s);
String(const String &s);
String(int a,char ch);
~String();
//重载= [ ]
String &operator = (char *str);
String &operator = (const String &s);
char operator [](int index);
//重载+ +=
String &operator +(const String &s);
String &operator +(char *str);
String &operator +=(const String &s);
String &operator +=(char *str);
//重载== !=
bool operator ==(char *str);
bool operator ==(const String &s);
bool operator !=(char *str);
bool operator !=(const String &s);
//重载> <
bool operator >(char *str);
bool operator >(const String &s);
bool operator <(char *str);
bool operator <(const String &s);
};
#endif
string.cpp
#include "string.h"
#include <cstring>
#include <iostream>
using namespace std;
String::String()
{
m_length = 0;
m_data = NULL;
}
String::String(char *s)
{
m_length = strlen(s);
m_data = new char [m_length + 1];
strcpy(m_data,s);
m_data[m_length] = '\0';
}
String::String(const String &s)
{
m_length =s.m_length;
m_data = new char [m_length +1];
strcpy(m_data, s.m_data);
m_data[m_length] = '\0';
}
String::String(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';
}
String::~String()
{
if(m_data != NULL)
{
delete []m_data;
m_data = NULL;
}
}
ostream &operator <<(ostream &out, const String &s)
{
out<<s.m_data;
return out;
}
istream &operator >>(istream &in, String &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;
}
String &String::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;
}
String &String ::operator =(const String &s)
{
m_length = s.m_length;
if(m_data != NULL)
{
delete []m_data;
}
m_data = new char [m_length + 1];
strcpy(m_data, s.m_data);
m_data[m_length] = '\0';
return *this;
}
char String::operator [](int index)
{
return m_data[index];
}
String &String::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;
}
String &String::operator +(const String &s)
{
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;
}
bool String:: operator ==(char *str)
{
if(!strcmp(m_data, str) )
{
return true;
}
else
{
return false;
}
}
bool String::operator == (const String &s)
{
if(!strcmp(m_data, s.m_data))
{
return true;
}
else
{
return false;
}
}
bool String::operator >(char *str)
{
int i = 0;
for(i = 0; i < m_length; i++)
{
if(m_data[i] > str[i])
{
return true;
}
break;
}
return false;
}
bool String::operator >(const String &s)
{
for(int i = 0; i < m_length; i++)
{
if(m_data[i] > s.m_data[i])
{
return true;
}
break;
}
return false;
}
主函数mainstring.cpp
#include "string.h"
#include <iostream>
using namespace std;
int main()
{
String s1;
String s2("wiww");
String s3(s2);
String s4(10,'s');
/* cout<<s2<<endl;
cout<<s3<<endl;
cout<<s4<<endl;
cin>>s1;
cout<<s1<<endl;
s2 = s1;
cout<<s2<<endl;
cout<<s2[0]<<endl;
s1 = s2 + "wwwww";
cout<<s1<<endl;
s1 = s2 + s3;
cout<<s1<<endl;
if(s2 == "hello")
{
cout<<"Equal"<<endl;
}
else
{
cout<<"Not Equal"<<endl;
}
if(s2 == s3)
{
cout<<"Equal"<<endl;
}
else
{
cout<<"Not Equal"<<endl;
}*/
if(s2 > "sad")
{
cout<<">"<<endl;
}
else
{
cout<<"<="<<endl;
}
if(s2 > s3)
{
cout<<">"<<endl;
}
else
{
cout<<"<="<<endl;
}
return 0;
}
|