通过C++对String进行重载

首先,我们将所需写重载函数和其他成员变量放在一个头文件中。

函数重载的判断标准(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;
}