创建一个简单的String类,运行异常
#include <iostream>using namespace std;
class String
{
public:
String();
String(const char *const ch);//创建自适应字符串长度的字符串大小。
int getlen()const{return len;}//求字符串长度。
char *getstr()const{return str;}//不改变返回的字符串。
char &operator[](unsigned short int length);//限制字符串超出界限。
char operator[](unsigned short int length)const;//此函数式为const函数服务的。如果没有这个函数,那么在调用复制构造函数String::String(const String&rs)
//编译时就为出错的,因为复制构造函数参数声明的是const String&rs;
//由于是字符传递的,所以的值传递。
String(const String &rs);//复制构造函数,这样可以完成给字符串赋值初始化。
String &operator =(const String &s);//重载=,使对象可以直接被赋值为字符串。
private:
unsigned short int len;//字符串的长度。
char *str;//指向字符串的。
};
String::String()
{
cout<<"无参数构造函数执行中...."<<endl;
len=0;
str=new char[1];
str[0]='\0';
}
String::String(const char *const ch)
{
cout<<"带一个参数的构造函数...."<<endl;
len=strlen(ch);
str=new char(len+1);//字符串长度加1,是为了把最后一个字符放字符串的结束标志。
for(int i=0;i<len;i++)
{
str[i]=ch[i];
}
str[len]='\0';
}
char &String::operator[](unsigned short int length)
{
cout<<"operator[]执行...";
if(length>len)
return str[len-1];//当length大于len时,返回最后一个可见字符,即最后一个字符。由于用的是引用返回所以可以对其最后一个可见字符进行修改。
else
return str[length];
}
char String::operator[](unsigned short int length)const
{
if(length>len)
return str[len-1];//当length大于len时,返回最后一个可见字符,即最后一个字符。由于用的是引用返回所以可以对其最后一个可见字符进行修改。
else
return str[length];
}
String::String(const String &rs)
{
cout<<"复制构造函数执行中...."<<endl;
len=rs.getlen();
str=new char[len+1];
for(int i=0;i<len;i++)
{
str[i]=rs[i];//虽然rs是一个对象但是由于我们已经对[]进行重载了,所以可以直接用rs[];
}
str[len]='\0';
}
String& String::operator=(const String &h)
{
cout<<"operator=执行中...."<<endl;
if(this==&h)//this指针指向的是=左边的对象,
{
return *this;
}
delete []str;
len=h.getlen();
str=new char[len+1];
for(int i=0;i<len;i++)
{
str[i]=h[i];//由于[]已经重载过了,所以可以直接用,如果没有重载则不可以直接用,需要s.getstr();来实现
}
str[len]='\0';
return *this;
}
int main()
{
/*
String s;
cout<<s.getlen()<<endl;
String s1("study");
cout<<s1.getstr()<<endl;
char *temp="help me";
String s2(temp);
cout<<s2.getlen()<<endl<<s2.getstr()<<endl;
cin>>s2[99];
cout<<s2.getlen()<<endl<<s2.getstr()<<endl;
cout<<s2[99]<<endl;
String s3=s2;
cout<<"s3:"<<s3.getstr()<<endl;
*/
String s4("hello world"),s5("help me");
s4=s5;
String s6;
s4=s5=s6;
cout<<s4.getstr()<<endl;
cout<<s5.getstr()<<endl;
cout<<s6.getstr()<<endl;
return 0;
}