String类的具体实现

C语言字符串的表示形式只有char型数组,而C++语言增加了string的封装类,集成了一些实用的成员函数,其实也是对运算符的重载,以便于用户的使用,如判断运算符>、<、==,比char型数组的比较strcmp方便多了。此外还重载了赋值运算符=和访问元素符[],以及增加一些友元函数,可以支持cin 、cout等实现连续的输入和输出。为区别string标准类库,本文定义了String类以实现以上所述的功能。

String类的头文件

#ifndef STRING_H_
#define STRING_H_
#include <iostream>
using namespace std;
class String{
	char *str;
	int len;
	static int iNumStr;
public:
	//构造函数及其他函数
	String();//默认构造函数
	~String();//析构函数
	String(const char *);//以char型字符数组为参数的构造函数
	String(const String &);//拷贝构造函数
	int GetLength()const;//获取字符串长度	
	//重载运算符
	String & operator=(const String &);//赋值运算符重载函数
	String & operator=(const char *);//赋值运算符重载函数
	char & operator[](int );//字符串对应char型数组访问符【】重载函数
	const char & operator[](int )const;//字符串对应char型数组访问符【】重载函数	
	//友元函数
	friend ostream & operator <<(ostream & os,const String & st);//友元函数重载<<操作符
	friend istream & operator >>(istream & os,String & st);//友元函数重载>>操作符
	friend bool operator > (const String st1,const String st2);//友元函数重载>比较运算符
	friend bool operator < (const String st1,const String st2);//友元函数重载<比较运算符
	friend bool operator == (const String st1,const String st2);//友元函数重载==比较运算符
	//静态成员函数
	static int HowMany();//静态成员函数
};
#endif


String类的函数实现源文件

#include "String.h"
#include <cstring>
int String::iNumStr=0;//类内静态成员变量初始化,需要去除static关键字,并在变量前保持其变量类型。
String::String()//默认构造函数
{
	len=0;
	str=new char [1];
	str[0]='\0';
	++iNumStr;
}
String::~String()//析构函数
{
	delete [] str;
	--iNumStr;
}
String::String(const char * st)//以char型字符数组为参数的构造函数
{
	len=strlen(st);
	str=new char [len+1];
	strcpy(str,st);
	++iNumStr;
}
String::String(const String & st)//拷贝构造函数
{
	len=st.len;
	str=new char [len+1];
	strcpy(str,st.str);
	++iNumStr;
}
int String::GetLength()const//获取字符串长度
{
	return len;
}
String & String::operator= (const String & st)//赋值运算符重载函数
{
	if(this==&st)
		return *this;
	len=st.len;
	delete [] str;
	str=new char [len+1];
	strcpy(str,st.str);
	++iNumStr;
	return *this;
}
String & String::operator= (const char * st)//赋值运算符重载函数
{		
	delete [] str;
	len=strlen(st);
	str=new char [len+1];
	strcpy(str,st);
	++iNumStr;
	return *this;
}
char & String::operator[](int i)//字符串对应char型数组访问符【】重载函数
{
	return str[i];
}
const char & String::operator[](int i)const//字符串对应char型数组访问符【】重载函数
{
	return str[i];
}
ostream & operator<<(ostream & os,const String & st)//友元函数重载<<操作符
{	
	return os<<st.str;
}
istream & operator>>(istream & os,String & st)//友元函数重载<<操作符
{	
	return os>>st.str;
}
bool operator > (const String st1,const String st2)//友元函数重载>比较运算符
{
	int len1=st1.len;
	int len2=st2.len;
	for(int i=0;i<len1&&i<len2;++i)
	{
		if(st1[i]==st2[i])
			continue;
		else
			return st1[i]>st2[i];
	}
	return len1>len2;
}
bool operator < (const String st1,const String st2)//友元函数重载<比较运算符
{
	return st2>st1;
}
bool operator == (const String st1,const String st2)//友元函数重载==比较运算符
{
	int len1=st1.len;
	int len2=st2.len;
	for(int i=0;i<len1&&i<len2;++i)
	{
		if(st1[i]==st2[i])
			continue;
		else
			return st1[i]==st2[i];
	}
	return len1==len2;
}
int String::HowMany() //静态成员函数
{
	return iNumStr;
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值