数组(三)

字符串类

#include <iostream>
using namespace std;

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

////////////////////////////////////////////////////////////////////
// 构造函数

String::String() 
{
    itsString 
= new char[1];
    itsString[
0= '\0';
    itsLen 
= 0;
}


String::String(unsigned 
short len) {
    itsString 
= new char[len + 1];

    
for (unsigned short i = 0; i <= len; i++)
        itsString[i] 
= '\0';
    itsLen 
= len;
}


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


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


String::
~String() {
    delete [] itsString;
    itsLen 
= 0;
}


///////////////////////////////////////////////////////////////////////
// 以下实现自定义的操作符重载

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


char& String::operator [](unsigned short offset) {
    
if (offset > itsLen)
        
return itsString[itsLen - 1];
    
else
        
return itsString[offset];
}


char String::operator [](unsigned short offset) const {
    
if (offset > itsLen)
        
return itsString[itsLen - 1];
    
else
        
return itsString[offset];
}


String String::
operator +(const String& rhs) {
    unsigned 
short totalLen = itsLen + rhs.GetLen();
    String temp 
= String(totalLen);

    unsigned 
short i, j;
    
for (i = 0; i < itsLen; i++)
        temp[i] 
= itsString[i];
    
for (j = 0; j < rhs.GetLen(); i++, j++)
        temp[i] 
= rhs[j];
    temp[totalLen] 
= '\0';

    
return temp;
}


void String::operator += (const String& rhs) {
    unsigned 
short rhsLen = rhs.GetLen();
    unsigned 
short totalLen = itsLen + rhsLen;
    String temp(totalLen);

    unsigned 
short i, j;
    
for (i = 0; i < itsLen; i++)
        temp[i] 
= itsString[i];
    
for (j = 0; j < rhsLen; i++, j++)
        temp[i] 
= rhs[j];
    temp[totalLen] 
= '\0';

    
*this = temp;    
}


int main(int argc, char *argv[])
{
    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;
     
    
return 0;
}

posted on 2005-04-28 01:03  NeilChen  阅读(500)  评论(0编辑  收藏  举报

导航