谁来帮我解决这个问题?
#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;
}
理解上面虚线之间是如何被调用的?
[解决办法]
String的源代码?
和你一起等待高手的出现!
[解决办法]
temp[i]=rhs[j];
=============================
temp[i]是赋值了,不可能调用那个返回常量的操作符吧?
[解决办法]
不是很理解你的意思。
编译器根据上下文来选择合适的重载操作符,如果没有就选用默认操作符,否则就报错了。
[解决办法]
/*
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;
}
[解决办法]
帮顶了~楼上强人,用了这么多年VC从来没想过这些~~
[解决办法]
C++ primer上有说的吧