首先,我们将所需写重载函数和其他成员变量放在一个头文件中。
函数重载的判断标准(1、参数个数不同 2、参数类型不同 3、参数顺序不同)
注意:函数的返回值不可作为函数重载的判断标准。
在这里存在对运算符的重载,在运算符的重载前,需要加关键字operator
在这里对引用及对象要关注一下:引用返回的是变量,可以对他进行赋值。对象返回的是变量里面的值,不可以再次进行修改。
不能重载的运算符包括( . : .*(成员指针运算符) ?: sizeof )
当无法修改左操作数的类时,使用全局函数进行重载(例如:下面 << 属于ostream类,不可修改,只能用全局函数进行重载。)。
只能通过成员函数进行重载的运算符(= 【】 () ->)
#ifndef _MYSTRING_H
#define _MYSTRING_H
#include<iostream>
using namespace std;
class MyString
{
private:
char *m_data;
int m_len;
public:
MyString();
MyString(char *str);
MyString(int len,char ch);
MyString(const MyString &s);
MyString & operator +=(const MyString &s);
char & operator [](int index);
friend ostream & operator << (ostream &out,const MyString &s);
friend istream & operator >> (istream &in,MyString &s);
//友元函数,通过全局函数对 << 和 >> 进行重载
MyString & operator =(const MyString &s);
MyString & operator =(const char *str);
//这里对=号进行了两次不同形参的重载。
};
#endif
我们在另一个文件中对函数进行具体的实现。
#include<iostream>
#include<string.h>
#include"MyString.h"
using namespace std;
MyString::MyString()
{
m_data=new char;
m_len=1;
}
MyString::MyString(char *str)
{
m_len=strlen(str);
m_data=new char[m_len+1];
//‘\0’占用一个字符空间。
strcpy(m_data,str);
}
MyString::MyString(int len,char ch)
{
m_len=len;
m_data=new char[m_len+1];
for(int i=0;i<len;i++)
{
m_data[i]=ch;
}
m_data[len]='\0';
}//实现数组里都是同一个字符。
MyString::MyString(const MyString &s)
{
m_len=s.m_len;
m_data=new char[m_len+1];
strcpy(m_data,s.m_data);
}
ostream & operator << (ostream &out,const MyString &s)
{
out << s.m_data;
return out;
} //对<< 进行重载。
istream & operator >> (istream &in,MyString &s)
{
char tmp[1024]={0};
in >> tmp;
if(s.m_data!=NULL)
{
delete s.m_data;
}
s.m_len=strlen(tmp);
s.m_data=new char[s.m_len+1];
strcpy(s.m_data,tmp);
return in;
}//对>> 进行重载。
MyString & MyString::operator +=(const MyString &s)
{
m_len=m_len+s.m_len;
char *tmp=new char[m_len+1];
strcpy(tmp,m_data);
strcat(tmp,s.m_data);
delete m_data;
m_data=tmp;
return *this;
}//对+=进行重载。
MyString & MyString::operator =(const MyString &s)
{
/*if(*this==s)
{
return *this;
}*///这边如果未注释时需对==进行重载。
m_len=s.m_len;
if(m_data!=NULL)
{
delete m_data;
}
m_data=new char[s.m_len+1];
strcpy(m_data,s.m_data);
}
char & MyString::operator [](int index)
{
return m_data[index];
}
主函数如下,进行检查。
#include<iostream>
#include"MyString.h"
using namespace std;
int main()
{
MyString s1;
MyString s2("hello");
MyString s3(10,'a');
MyString s4(s2);
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
s1+=s2;
cout << s1 << endl;
cout << s2[0] << endl;
cin >> s2[1];
cout << s2 << endl;
return 0;
}