根据C++ Primer上的学习,昨天晚上刚刚写的String类 ,自己完善了下。
函数全部又内联函数实现,内联函数的类体外实现都写在头文件中(.h文件),自己只定义了头文件。
String.h文件
#ifndef STRING_H
#define
STRING_H

#include
<
iostream
>
#include
<
cstring
>
#include
<
cassert
>
#include
<
iomanip
>
//
使用setw()等函数
class
String;
using
namespace
std;
//
重载输入和输出操作符声明
istream
&
operator
>>
(istream
&
is
,String
&
str);
ostream
&
operator
<<
(ostream
&
os,
const
String
&
str);

class
String

...
{
public:
String();//默认构造函数
String(const char* ch);
String(const String& str);
~String();
//赋值
String& operator=(const String& str);
String& operator=(const char* ch);
//索引访问单个字符
char& operator[](int index);
//字符串大小
int size();
//访问字符串
char* c_str();
//两个字符串相等比较
bool operator==(const String& str);
bool operator==(const char* ch);
//返回字符中出现某个字符的个数
int count(char ch) const;
//链接字符串
String operator+(const String& str);
String operator+(const char* ch);
String& operator+=(const String& str);
String& operator+=(const char* ch);

private:
int _size;//字符串大小
char* _string;//字符串
private:
void Intial(const char* ch);
void Intial(const String& str);
}
;

/**/
/*内联函数的类外实现在头文件中*/

//
初始化函数
void
String::Intial(
const
char
*
ch)

...
{
if(!ch)//初始化字符串为空

...{
_size = 0;
_string = 0;
}
else//不为空申请空间

...{
_size = strlen(ch);
_string = new char[_size+1];
strcpy(_string,ch);
}
}
void
String::Intial(
const
String
&
str)

...
{
_size = str._size;
if(!str._string)//初始化字符串为空

...{
_size = 0;
_string = 0;
}
else//不为空申请空间

...{
_string = new char[_size + 1];
strcpy(_string,str._string);
}
}
//
字符串大小
inline
int
String::size()

...
{
return _size;
}
//
访问字符串
char
*
String::c_str()

...
{
return _string;
}
//
默认构造函数
inline String::String()

...
{
_size = 0;
_string = 0;
}
inline String::String(
const
char
*
ch)

...
{
Intial(ch);
}
inline String::String(
const
String
&
str)

...
{
Intial(str);
}
//
析构函数
inline String::
~
String()

...
{
delete[] _string;
}

//
索引访问单个字符
inline
char
&
String::
operator
[](
int
index)

...
{
assert(index>=0&&index<_size);//设置断言,防止数据越界
return _string[index];
}
//
两个字符串相等比较
inline
bool
String::
operator
==
(
const
char
*
ch)

...
{
return (strcmp(_string,ch)?false:true);
}
inline
bool
String::
operator
==
(
const
String
&
str)

...
{
return (strcmp(_string,str._string)?false:true);
}
//
赋值
inline String
&
String::
operator
=
(
const
char
*
ch)

...
{
//delete[] _string;
if(_string)//源字符串不为空

...{
String::~String();
}
Intial(ch);
return *this;
}
inline String
&
String::
operator
=
(
const
String
&
str)

...
{
if(this!=&str)//被赋予的不是源字符串

...{
if(_string)//源字符串不为空

...{
String::~String();
}
//delete[] _string;
Intial(str);
}
return *this;
}
//
重载输入和输出操作符
inline istream
&
operator
>>
(istream
&
is
,String
&
str)

...
{
//限制输入字符4096
const int limit_size = 4096;
char inBuf[limit_size];
//限制输入字符setw();
is>>setw(limit_size)>>inBuf;
str = inBuf;
return is;
}
inline ostream
&
operator
<<
(ostream
&
os,String
&
str)

...
{
return os<<str.c_str();
}
//
返回字符中出现某个字符的个数
inline
int
String::count(
char
ch)
const

...
{
int cnt = 0;
for(int i = 0;i < _size;++i)

...{
if(_string[i]==ch)

...{
++cnt;
}
}
return cnt;
}
//
链接字符串
inline String String::
operator
+
(
const
String
&
str)

...
{
String strCat;
if(!str._string)//被连接字符串为空则直接返回第一个字符串

...{
strCat = *this;
}
else if(!_string)//连接的字符串为空则直接返回被链接字符串

...{
strCat = str;
}
else//申请空间准备连接字符串

...{
strCat._size = _size + str._size;
strCat._string = new char[strCat._size+1];
strcpy(strCat._string,_string);
strcat(strCat._string,str._string);
}
return strCat;
}
inline String String::
operator
+
(
const
char
*
ch)

...
{
String strCat;
if(!ch)//被连接字符串为空则直接返回第一个字符串

...{
strCat = *this;
}
else if(!_string)//连接的字符串为空则直接返回被链接字符串

...{
strCat = ch;
}
else//申请空间准备连接字符串

...{
strCat._size = _size + strlen(ch);
strCat._string = new char[strCat._size+1];
strcpy(strCat._string,_string);
strcat(strCat._string,ch);
}
return strCat;
}
inline String
&
String::
operator
+=
(
const
String
&
str)

...
{
String strL;
if(str._string)//附加字符串不为空

...{
if(!_string)//源字符串为空则直接为附加的字符串申请空间

...{
_size = str._size;
_string = new char[_size+1];
strcpy(_string,str._string);
}
else//重新申请空间连接字符串

...{
strL = *this;
String::~String();
_size = _size + str._size;
_string = new char[_size+1];
strcpy(_string,strL._string);
strcat(_string,str._string);
}
}
return *this;
}
inline String
&
String::
operator
+=
(
const
char
*
ch)

...
{
String strL;
if(ch)//附加字符串不为空

...{
if(!_string)//源字符串为空则直接为附加的字符串申请空间

...{
_size = strlen(ch);
_string = new char[_size+1];
strcpy(_string,ch);
}
else//重新申请空间连接字符串

...{
strL = *this;
String::~String();
_size = _size + strlen(ch);
_string = new char[_size+1];
strcpy(_string,strL._string);
strcat(_string,ch);
}
}
return *this;
}
#endif
另外加了个小程序测试了一下。
StringCeshi.cpp文件
#include
"
String.h
"
#include
<
iostream
>
using
namespace
std;

int
main()

...
{
String a;//默认构造函数
String b("You are a good man!");//char*构造函数
String c(b);//拷贝构造函数
a = "good!";//char*赋值
//重载的<<和>>
cout<<"a:"<<a<<" ";
cout<<"b:"<<b<<" ";
cout<<"c:"<<c<<" ";
b=a;//String赋值
a=c;//String赋值
cout<<"a:"<<a<<" ";
cout<<"b:"<<b<<" ";
cout<<"c:"<<c<<" ";
//下标
cout<<"a[0]:"<<a[0]<<" ";
cout<<"b[1]:"<<b[1]<<" ";
cout<<"c[2]:"<<c[2]<<" ";
//字符串比较
if(a==b)

...{
cout<<"a==b"<<" ";
}
else

...{
cout<<"a!=b"<<" ";
}
if(a==c)

...{
cout<<"a==c"<<" ";
}
else

...{
cout<<"a!=c"<<" ";
}
//链接字符串
String strM = a+b;//String参数连接
String strN = a+"Connect char*";//String参数连接
cout<<"a+b="<<strM<<" ";
cout<<"a+"Connect char*"="<<strN<<" ";
//+=char*String
strM+=strN;
cout<<"strM+=strN---strM="<<strM<<" ";
//+=char*
strN+="OK!";
cout<<"strN+="OK!"---strN="<<strN<<" ";
return 0;
}