#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;
}理解上面虚线之间是如何被调用的?
#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;
}理解上面虚线之间是如何被调用的?
解决方案 »
- 练习的时候出现这样的错误~~不知道怎么回事
- 'CAdodc' : 'class' type redefinition(在线等答案)
- 仍未解决->如何改变单文档程序默认的视图大小问题
- 请问:插入/资源中的Dialog下不同选项的作用是什么?
- 用了PeekMessage函数,为什么关闭了窗口,程序还驻留
- 奇怪的建立空文档失败
- 编译问题
- 请 666 () 给我花flower源程序
- 菜问!!!!!!!!!!!!----ODBC连接数据库,怎么实现查找功能?用什么函数?
- MDI 加载新的资源动态库后,如何刷新所有窗口界面
- 我要用zip库写一个对多目录下文件的压缩,大家说说思路,有没有好的代码?
- 怎样在多文档中添加自定义文档
=============================
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;
}