#include "iostream.h"
#include "string.h"
class String
{
public:
String();
String(const char *const);
String(const String &);
~String();
//如何理解这两个偏移运算符;如何理解在本程序中它们是如何被调用以及为什么会被调用的?
char & operator[](unsigned short offset);
char operator[](unsigned short offset) const;
String operator +(const String&);
void operator +=(const String&);
String &operator =(const String &);unsigned short GetLen()const{return itsLen;}
const char *GetString()const{return itsString;}private:
String(unsigned short);
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];//运用operator[]
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];//运用operator[]
itsString[itsLen]='\0';
return *this;
}
____________________________________________________________
char & String::operator[](unsigned short offset)//返回非常char引用的重载[]运算符函数
{
cout<<"execute char & operator[](unsigned short)\n";//此处我打印只是用来追踪其执行时机
if(offset>itsLen)
return itsString[itsLen-1];
else
return itsString[offset];
}char String::operator[](unsigned short offset)const//返回常char量的重载[]运算符函数
{
cout<<"execute char operator[](unsigned short)const\n";//同上
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(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];//根据打印的结果,说明这里都是调用char String::operator[](unsigned short)const
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;
for (i=0;i<itsLen;i++)
temp[i]=itsString[i];//这里调用的是char String::operator[](unsigned short)const
for (unsigned short j=0;j<rhsLen;j++,i++)
temp[i]=rhs[i-itsLen];//这里则先后调用了char String::operator[](unsigned short)const、char & String::operator[](unsigned short)
temp[totalLen]='\0';
*this=temp;
}
//如何理解上面的+、+=这两个重载对两个偏移运算符的调用?int main(int argc, char* argv[])
{
String s1("My string class run start...");
cout<<"0)s1:\t"<<s1.GetString()<<endl;char * temp="hello";
s1=temp; 
cout<<"1)s1:\t"<<s1.GetString()<<endl;char tempTwo[20];
strcpy(tempTwo," world!");
s1+=tempTwo;
cout<<"2)tempTwo:\t"<<tempTwo<<endl;
cout<<"3)s1:\t"<<s1.GetString()<<endl;cout<<"4)s1[4]:\t"<<s1[4]<<endl;
s1[4]='x';
cout<<"5)s1:\t"<<s1.GetString()<<endl;cout<<"6)s1[999]:\t"<<s1[99]<<endl;
String s2("Bye!");
String s3;
s3=s1+s2;
cout<<"7)s3:\t"<<s3.GetString()<<endl;String s4;
s4="See you!";
cout<<"8)s4:\t"<<s4.GetString()<<endl;
return 0;
}理解上面虚线之间是如何被调用的?

解决方案 »

  1.   

    String的源代码?和你一起等待高手的出现!
      

  2.   

    temp[i]=rhs[j];
    =============================
    temp[i]是赋值了,不可能调用那个返回常量的操作符吧?
      

  3.   

    /*
    String s(size);
    char c;
    s[i]=c; //用的是 char & operator[](unsigned short offset);     (1)
    c=s[i]; //用的是 char operator[](unsigned short offset) const; (2)
    */
    String s1("My string class run start...");
    char * temp="hello"; //调用五次(2)
    s1=temp; // 先将char*通过String(const char *)转换为一个临时的String变量,
    //然后调用String &operator =(const String &); 
    //此时相当于c=s[i]; 会调用五次(2)
    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];//这里调用的是(1), 不是(2),你将前面输出的五次(2)误当在是这里的输出了
    for (unsigned short j=0;j<rhsLen;j++,i++)
    temp[i]=rhs[i-itsLen];//这里则先后调用了(2)/(1)
    temp[totalLen]='\0';
    *this=temp;
    }