改造串类.docx
《改造串类.docx》由会员分享,可在线阅读,更多相关《改造串类.docx(14页珍藏版)》请在冰豆网上搜索。
改造串类
实验报告
实验题目:
实验2改造串类
姓名:
学号:
班级:
组别:
协作者:
指导教师:
实验时间:
周,星期,年月日
实验概述:
【实验目的及要求】:
对主教材的字符串String类操作较少,试重载字符串连接运算符+、重载字符串流输入运算符>>与输入运算符<<实现一个功能更强的类CString
【实验原理】:
【实验环境】(使用的软件):
MicrosoftVisualStudio2010
实验内容:
对主教材的字符串String类操作较少,试重载字符串连接运算符+、重载字符串流输入运算符>>与输入运算符<<实现一个功能更强的类CString
【实验方案设计】:
cstring.h
#ifndef__CString_H__
#define__CString_H__
#include"lk_list.h"//线性链表
//串类
classCString
{
protected:
//串实现的数据成员
mutablechar*strVal;//串值
intlength;//串长
public:
//抽象数据类型方法声明及重载编译系统默认方法声明
CString();//构造函数
virtual~CString();//析构函数
CString(constCString©);//复制构造函数
CString(constchar*copy);//从c风格串转换的构造函数
CString(LinkList©);//从线性表转换的构造函数
intLength()const;//求串长度
boolEmpty()const;//判断串是否为空
CString&operator=(constCString©);//赋值语句重载
constchar*CStr()const;//将串转换成C风格串
char&CString:
:
operator[](intpos)const;//重载下标运算符
};
//串相关操作
CStringoperator+(constCString&strFirst,constCString&strSecond);
//重载加法运算符+
ostream&operator<<(ostream&outStream,constCString&outStr);
//重载运算符<<
istream&operator>>(istream&inStream,CString&inStr);
//重载运算符>>
CStringRead(istream&input);//从输入流读入串
CStringRead(istream&input,char&terminalChar);
//从输入流读入串,并用terminalChar返回串结束字符
voidWrite(CString&s);//输出串
voidConcat(CString&addTo,constCString&addOn);
//将串addOn连接到addTo串的后面
voidCopy(CString©,constCString&original);
//将串original复制到串copy
voidCopy(CString©,constCString&origina,intn);
//将串original复制n个字符到串copy
intIndex(constCString&target,constCString&pattern,intpos=0);
//查找模式串pattern第一次在目标串target中从第pos个字符开始出现的位置
CStringSubString(constCString&s,intpos,intlen);
//求串s的第pos个字符开始的长度为len的子串
booloperator==(constCString&first,constCString&second);
//重载关系运算符==
booloperator<(constCString&first,constCString&second);
//重载关系运算符<
booloperator>(constCString&first,constCString&second);
//重载关系运算符>
booloperator<=(constCString&first,constCString&second);
//重载关系运算符<=
booloperator>=(constCString&first,constCString&second);
//重载关系运算符>=
booloperator!
=(constCString&first,constCString&second);
//重载关系运算符!
=
//串类及相关操作的实现部分
CString:
:
CString()
//操作结果:
初始化串
{
length=0;//串长度为0
strVal=NULL;//空串
}
CString:
:
~CString()
//操作结果:
销毁串,释放串所占用空间
{
delete[]strVal;//释放串strVal
}
CString:
:
CString(constCString©)
//操作结果:
由串copy构造新串——复制构造函数
{
length=strlen(copy.CStr());//串长
strVal=newchar[length+1];//分配存储空间
strcpy(strVal,copy.CStr());//复制串值
}
CString:
:
CString(constchar*copy)
//操作结果:
从c风格串转换构造新串——转换构造函数
{
length=strlen(copy);//串长
strVal=newchar[length+1];//分配存储空间
strcpy(strVal,copy);//复制串值
}
CString:
:
CString(LinkList©)
//操作结果:
从线性表转换构造新串——转换构造函数
{
length=copy.Length();//串长
strVal=newchar[length+1];//分配存储空间
for(inti=0;i{//复制串值
copy.GetElem(i+1,strVal[i]);
}
strVal[length]='\0';//串值以‘\0’结束
}
intCString:
:
Length()const
//操作结果:
返回串长度
{
returnlength;
}
boolCString:
:
Empty()const
//操作结果:
如果串为空,返回true,否则返回false
{
returnlength==0;
}
CString&CString:
:
operator=(constCString©)
//操作结果:
赋值语句重载
{
if(©!
=this)
{
delete[]strVal;//释放原串存储空间
length=strlen(copy.CStr());//串长
strVal=newchar[length+1];//分配存储空间
strcpy(strVal,copy.CStr());//复制串值
}
return*this;
}
constchar*CString:
:
CStr()const
//操作结果:
将串转换成c风格串
{
return(constchar*)strVal;//串值类型转换
}
char&CString:
:
operator[](intpos)const
//操作结果:
重载下标运算符
{
inti=0;
returnstrVal[i];
}
voidConcat(CString&addTo,constCString&addOn)
//操作结果:
将串addOn连接到addTo串的后面
{
constchar*cFirst=addTo.CStr();//指向第一个串
constchar*cSecond=addOn.CStr();//指向第二个串
char*copy=newchar[strlen(cFirst)+strlen(cSecond)+1];//分配存储空间
strcpy(copy,cFirst);//复制第一个串
strcat(copy,cSecond);//连接第二个串
addTo=copy;//串赋值
delete[]copy;//释放copy
}
CStringoperator+(constCString&strFirst,constCString&strSecond)
//操作结果:
重载加法运算符
{
constchar*cFirst=strFirst.CStr();//指向第一个串
constchar*cSecond=strSecond.CStr();//指向第二个串
char*copy=newchar[strlen(cFirst)+strlen(cSecond)+1];//分配存储空间
strcpy(copy,cFirst);//复制第一个串
strcat(copy,cSecond);//连接第二个串
CStringanswer(copy);//构造串
delete[]copy;//释放copy
returnanswer;//返回串
}
ostream&operator<<(ostream&outStream,constCString&outStr)
//操作结果:
重载运算符<<
{
cout<returnoutStream;//返回输出流对象
}
istream&operator>>(istream&inStream,CString&inStr)
//操作结果:
重载运算符>>
{
LinkListtemp;//临时线性表
intsize=0;//初始线性表长度
charch;//临时字符
while((ch=inStream.peek())!
=EOF&&//peak()从输入流中取一个字符
//输入流指针不变
(ch=inStream.get())!
='\n');//get()从输入流中取一个字符ch
{
temp.Insert(++size,ch);//构造串
}
CStringanswer(temp);//用inStr返回串
inStr=answer;
returninStream;//返回输入流对象
}
CStringRead(istream&input)
//操作结果:
从输入流读入串
{
LinkListtemp;//临时线性表
intsize=0;//初始线性长度
charch