首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

哪位高手来帮小弟我解决这个有关问题

2012-02-17 
谁来帮我解决这个问题?#includeiostream.h #includestring.h classString{public:String()String(con

谁来帮我解决这个问题?
#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上有说的吧

热点排行