通过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;
}
扫描二维码关注公众号,回复: 2556131 查看本文章

猜你喜欢

转载自blog.csdn.net/tmh_15195862719/article/details/81233927
今日推荐