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;
}