长沙库尔勒:利用C++设计一个字符串类(帮个忙,十分感谢!!)

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/08 17:02:58
设计一个字符串类,功能如下:
1) 能够用 “+” 来处理两个字符串的相加 (运算符重载)
2) 具有在一个字符串中搜索一个字符的功能 ( )
3) 具有在一个字符串中搜索另一个字符串的功能
4)具有在一个字符串中删除另一个字符串中字符的功能
5)具有在一个字符串后连接另一个字符串的功能
6)能够把一个字符串复制给另一字符串
5) 编写一个main()函数,测试你的字符串类的各种功能。
7)对给出的程序源代码要给出各部分的详细注释.
8)自己根据能力及需要添加相应功能模块,增强模拟系统功能.
能不能对给出的程序源代码要给出各部分的详细注释(中文注释).谢谢!!

#include <iostream>
#include <string.h>
using namespace std;

// Rudimentary string class
class String
{
public:
// constructors
String();
String(const char *const);
String(const String &);
~String();

// overloaded operators
char & operator[](unsigned short offset);
char operator[](unsigned short offset) const;
String operator+(const String&);
void operator+=(const String&);
String & operator= (const String &);

// General accessors
unsigned short GetLen()const { return itsLen; }
const char * GetString() const { return itsString; }

private:
String (unsigned short); // private constructor
char * itsString;
unsigned short itsLen;
};

// default constructor creates string of 0 bytes
String::String()
{
itsString = new char[1];
itsString[0] = '\0';
itsLen=0;
}
String::String(const String & rhs)
{
itsLen=rhs.GetLen();
itsString=new char[itsLen+1];
for(unsigned short i=0;i<itsLen;i++)
itsString[i]=rhs[i];
itsString[itsLen]='\0';
cout<<"the time constructor:"<<endl;
}
// private (helper) constructor, used only by
// class methods for creating a new string of
// required size. Null filled.
String::String(unsigned short len)
{
itsString = new char[len+1];
for (unsigned short i = 0; i<=len; i++)
itsString[i] = '\0';
itsLen=len;
}

// Converts a character array to a String
String::String(const char * const cString)
{
itsLen = strlen(cString);
itsString = new char[itsLen+1];
for (unsigned short i = 0; i<itsLen; i++)
itsString[i] = cString[i];
itsString[itsLen]='\0';

}

// copy constructor

// destructor, frees allocated memory
String::~String ()
{
delete [] itsString;
itsLen = 0;
}

// operator equals, frees existing memory
// then copies string and size
String& String::operator=(const String & rhs)
{
if (this == &rhs)
return *this;
delete [] itsString;
itsLen=rhs.GetLen();
itsString = new char[itsLen+1];
for (unsigned short i = 0; i<itsLen;i++)
itsString[i] = rhs[i];
itsString[itsLen] = '\0';
return *this;
}

//nonconstant offset operator, returns
// reference to character so it can be
// changed!
char & String::operator[](unsigned short offset)
{
if (offset > itsLen)
return itsString[itsLen-1];
else
return itsString[offset];
}

// constant offset operator for use
// on const objects (see copy constructor!)
char String::operator[](unsigned short offset) const
{
if (offset > itsLen)
return itsString[itsLen-1];
else
return itsString[offset];
}

// creates a new string by adding current
// string to rhs
String String::operator+(const String& rhs)
{
unsigned short totalLen = itsLen + rhs.GetLen();
String temp(totalLen);
unsigned short i;
for ( i= 0; i<itsLen; i++)
temp[i] = itsString[i];
for (unsigned short j = 0; j<rhs.GetLen(); j++, i++)
temp[i] = rhs[j];
temp[totalLen]='\0';
return temp;
}

// changes current string, returns nothing
void String::operator+=(const String& rhs)
{
unsigned short rhsLen = rhs.GetLen();
unsigned short totalLen = itsLen + rhsLen;
String temp(totalLen);
unsigned short i;
for (i = 0; i<itsLen; i++)
temp[i] = itsString[i];
for (unsigned short j = 0; j<rhs.GetLen(); j++, i++)
temp[i] = rhs[i-itsLen];
temp[totalLen]='\0';
*this = temp;
}

int main()
{

String s1("initial test");
cout << "S1:\t" << s1.GetString() << endl;

char * temp = "Hello World";
s1 = temp;
cout << "S1:\t" << s1.GetString() << endl;

char tempTwo[20];
strcpy(tempTwo,"; nice to be here!");
s1 += tempTwo;
cout << "tempTwo:\t" << tempTwo << endl;
cout << "S1:\t" << s1.GetString() << endl;

cout << "S1[4]:\t" << s1[4] << endl;
s1[4]='x';
cout << "S1:\t" << s1.GetString() << endl;

cout << "S1[999]:\t" << s1[999] << endl;

String s2(" Another string");
String s3;
s3 = s1+s2;
cout << "S3:\t" << s3.GetString() << endl;

String s4;
s4 = "Why does this work?";
cout << "S4:\t" << s4.GetString() << endl;
string ss("abcdefg");
string &rwjx=ss;

return 0;
}
怎么样,实现了多种运算符的重载.

在类里调用"string.h"的功能好了啊
要具体程序吗?