string类的实现(实现了一部分功能)

#ifndef _MSTRING_H_
#define _MSTRING_H_

#include <iostream>

using namespace std;

namespace kaka{
class String;
/*
 * 输出操作符的重载函数
 */
std::ostream& operator<<(std::ostream &os,const String &a);
/*
 * 输出操作符的重载函数
 */
std::istream& operator>>(std::istream &os,String &a);

class String
{
friend std::ostream& operator<<(std::ostream &os,const String &a);	//设为友元函数,使它能访问该类的私有成员
friend std::istream& operator>>(std::istream &is,String &a);
public:
	String();	//构造函数
	~String();	//析构函数
	String(const char *str);		//构造函数的重载
	String(const String &);
	String& operator=(const String &str);	//等号操作符的重载
	String& operator=(const char *str);		
	char& operator[](int index);			//[]操作符的重载
	String& operator+=(const String &str);	//+=操作符重载函数
	String& operator+=(const char *str);	
	bool operator!=(const String &str);	//!=操作符重载
	bool operator!=(const char *str);
	bool operator>(const char *str);
	bool operator>(const String &str);	//>操作符重载
	bool operator>=(const char *str);
	bool operator>=(const String &str);	//>=操作符重载
	bool operator<(const char *str);
	bool operator<(const String &str);	//<操作符重载
	bool operator<=(const char *str);	
	bool operator<=(const String &str);	//<=操作符重载
	bool operator==(const String &str);	//==操作副重载
	bool operator==(const char *str);	
	String strcat(const char *str);		//string拼接
	String strcat(const String &str);	
	String substring(int index,int number);//截取子串
	String substring(int index);
	String strcpy(char *str);		//string复制
	String strcpy(String src);
	char* getstring();
	inline bool isempty()
	{
		if(*_string=='\0')
			return true;
		else
			return false;
	}
	int length();
	void clear();
private:
	char *_string;
	int _length;
};

};

#endif

这是头文件mstring.h的定义
 

接下来是mstring.cpp实现功能接口

#include "mstring.h"
#include <iostream>

using namespace std;

namespace kaka{
/*
 * 输出操作符的重载函数
 */
std::ostream& operator<<(std::ostream &os,const String &a)
{
	os<<a._string;
	return os;
}

/*
 * 输出操作符的重载函数
 */
std::istream& operator>>(std::istream &is,String &a)
{
	char temp[255];
	is>>temp;
	a=temp;
	return is;
}

String::String()	//构造函数
{
	_string=NULL;
	_length=0;
}

String::~String()	//析构函数
{
	if(_string!=NULL)
	{
		delete[] _string;
		_length=0;
	}
}

String::String(const char *str)		//构造函数的重载
{
	int i=0;
	_length=0;
	while(str[_length]!='\0')
	{
		_length++;
	}
	_string=new char[_length+1];
	while(str[i]!='\0')
	{
		_string[i]=str[i];
		i++;
	}
	_string[i+1]='\0';
}

String::String(const String &str)
{
	int i=0;
	_length=str._length;
	_string=new char[_length+1];
	while(str._string[i]!='\0')
	{
		_string[i]=str._string[i];
		i++;
	}
	_string[i+1]='\0';

}

String& String::operator=(const String &str)	//等号操作符的重载
{
	strcpy(str);
	return *this;
}

String& String::operator=(const char *str)
{
	strcpy(str);
	return *this;
}

char& String::operator[](int index)			//[]操作符的重载
{
	return _string[index];
}

String& String::operator+=(const String &str)	//+=操作符重载函数
{
	strcat(str);
	return *this;
}

String& String::operator+=(const char *str)	
{
	strcat(str);
	return *this;
}

bool String::operator!=(const String &str)	//!=操作符重载
{
	if(_length!=str._length)	//先比较长度是否相同,若不相等,直接返回true,节省比较时间
		return true;
	else
	{
		int i=0;
		while(_string[i]!='\0'&&str._string[i]!='\0')
		{
			if(_string[i]==str._string[i])
				continue;
			else
				return true;
		}
		return false;
	}
}

bool String::operator!=(const char *str)
{
	int length=0;
	while((*str++)!='\0')		//算出str的长度
	{
		length++;
	}
	if(_length!=length)
		return true;
	else
	{
		int i=0;
		while(_string[i]!='\0'&&str[i]!='\0')
		{
			if(_string[i]==str[i])
				continue;
			else
				return true;
		}
		return false;
	}
}

bool String::operator>(const char *str)	//>操作符重载
{
	unsigned int i=0;
	while(_string[i]!='\0'&&str[i]!='\0')
	{
		if(_string[i]==str[i])
		{
			i++;
			continue;
		}
		else if(_string[i]>str[i])
		{
			return true;
		}
		else
			return false;
	}
	if(i>=this->length())
		return false;
	else
		return (_string[i]>str[i]);
}

bool String::operator>(const String &str)
{
	return (*this>str._string);

}

bool String::operator>=(const char *str)	//>=操作符重载
{
	unsigned int i=0;
	while(_string[i]!='\0'&&str!='\0')
	{
		if(_string[i]==str[i])
		{
			i++;
			continue;
		}
		else if(_string[i]>str[i])
		{
			return true;
		}
		else
			return false;
	}
	if(_string=='\0'&&str[i]=='\0')
		return true;
	else
		return (_string[i]>str[i]);
}

bool String::operator>=(const String &str)
{
	return (*this>=str._string);
}

bool String::operator<(const String &str)	//<操作符重载
{
	return !(*this>=str._string);
}

bool String::operator<(const char *str)
{
	return !(*this>=str);
}

bool String::operator<=(const String &str)	//<=操作符重载
{
	return !(*this>str._string);
}

bool String::operator<=(const char *str)	
{
	return !(*this>str);
}

bool String::operator==(const String &str)	//==操作副重载
{
	if(*this>str)
		return false;
	else if(*this<str)
		return false;
	else
		return true;
}

bool String::operator==(const char *str)	
{
	if(*this<str)
		return false;
	else if(*this<str)
		return false;
	else
		return true;
}

String String::strcat(const char *str)	//string拼接
{
	int i=0;
	char *temp,*s_string;
	while(str[i++]!='\0')
	{
	}
	_length=_length+i;
	temp=new char[_length+1];
	s_string=temp;					//保存temp字符串的首地址
	i=0;
	while(_string[i]!='\0')
	{
		*temp=_string[i];
		temp++;
		i++;
	}
	i=0;
	while(str[i]!='\0')
	{
		*temp=str[i];
		temp++;
		i++;
	}
	*temp='\0';
	_string=s_string;
	return String(s_string);


}

String String::strcat(const String &str)
{
	return strcat(str._string);
}

String String::substring(int index,int number)//截取子串
{
	char *s_string=new char[number];
	int	i=0;
	int pos=index;
	while(i<=number-1)
	{
		s_string[i++]=_string[pos++];
	}
	s_string[i]='\0';
	return String(s_string);

}

String String::substring(int index)
{
	return substring(index,length()-index+1);

}

String String::strcpy(char *str)
{
	clear();
	int i=0;
	while(str[i++]!='\0')
	{
	}
	_string=new char[i+1];
	i=0;
	while(str[i]!='\0')
	{
		_string[i]=str[i];
		i++;
	}
	_string[i]='\0';
	_length=length();
	return *this;

}

String String::strcpy(String str)
{
	strcpy(str._string);
	return *this;

}

char* String::getstring()
{
	return _string;

}
int String::length()
{
	int length=0;
	while(_string[length]!='\0')
	{
		length++;
	}
	return length;

}

void String::clear()
{
	if(_string!=NULL)
	{
		delete[] _string;
		_string=NULL;
		_length=0;
	}

}

};


接下来是测试函数  只是测试了一部分

 

#include <iostream>
#include <mstring.h>

using namespace std;
using namespace kaka;

int main(void)
{
	String a("abcd");
	cout<<a<<endl;
	a="ffff";
	cout<<a<<endl;
	cout<<a.length()<<endl;
	String b("kkkkss");
	a+=b;
	cout<<a<<endl;
	cout<<a.length()<<endl;
	cin>>a;
	cout<<a<<endl;
	cout<<a.length()<<endl;

	return 0;
}
结果如下所示:



上述的测试不完全,若有发现BUG,谢谢通知我,谢谢大家~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值