3、 仿照标准字符串类string ,设计一个自己的字符串类String。
主要完成以下任务:
1)数据成员是字符指针,可自动适应不同的串长度。
2)串复制,既可使用字符串常量进行复制,也可以使用其他的字符串对象进行复制。
3)串赋值。既可赋值为字符串常量,也可以赋值为使用其他的字符串对象。
4)串连接。重载“+”和“+=”。
5)重载下标运算符[]。
6)串比较。重载 “”和“<”。
7)字符串输入和输出。重载“>>”和“<<”。
编程完成各函数的定义,并进行如下测试。
int main()
{
String s1(“Help!”),s2(“Good!”),s3(s2),s4,s5;
cout<<“s1=”<<s1<<endl;
s3=“Hello!”;
cout<<“s3=”<<s3<<endl;
s3=s2;
cout<<“s3=”<<s3<<endl;
s3+=s2;
cout<<“s3=”<<s3<<endl;
cin>>s4;
cout<<“s4=”<<s4<<endl;
s5=s3+s4;
cout<<“s5=”<<s5<<endl;
s5[0]=‘g’;
cout<<“s5=”<<s5<<endl;
cout<<“strlen(s5)=”<<s5.Length()<<endl;
cout<<boolalpha<<(s3s1)<<endl;
cout<<boolalpha<<(s3<s1)<<endl;
}
下面是代码
#include<iostream>
#include<cstring>
using namespace std;
class String
{
friend ostream & operator<<(ostream &cout, const String &s)
{
cout << s.str;
return cout; //cin,cout的重载,注意函数的返回值
}
friend istream & operator >>(istream &cin, String &s)
{
cin >> s.str;
if(cin)
return cin;
}
public:
String(const char* p="oidahnsinaskl" ) //构造函数
{
str= new char[strlen(p) + 1];//注意字符串的长度不包括最后的‘\0‘,所以长度要加一
strcpy(str, p);
}
String (const String &s)
{
str=new char[strlen(s.str)+1];//深复制,注意字符串的长度不一样
strcpy(str,s.str);
}
~String()
{
delete [] str;//析构函数,与new对应
}
int Length()
{
return strlen(str);
}
//接下来就是运算符重载
String& operator=(String &s)
{
str=new char[strlen(s.str)+1];
strcpy(str, s.str);
delete[]str;
return *this;
}
String &operator=(const char*s) //等号运算符的重载
{
this->str=new char[strlen(s)+1];
strcpy(str, s);
delete[]str;
return *this;
}
String& operator+(String &s)//加号重载注意返回值的类型
{
strcat(str,s.str);
return *this;
}
String& operator+=(String &s)//加等于号重载
{
strcat(str,s.str);
return *this;
}
char& operator[](int i)//【】重载
{
return str[i];
}
bool operator==(String &s)//关系符号重载
{
if(strcmp(str,s.str)==0)
{
return true;
}
else return false ;
}
bool operator<(String &s)
{
if(strcmp(str,s.str)<0)
{
return true;
}
else return false ;
}
private:
char *str;
};
int main()
{
String s1("Help!"),s2("Good!"),s3(s2),s4,s5;
cout<<"s1="<<s1<<endl;
s3="Hello!";
cout<<"s3="<<s3<<endl;
s3=s2;
cout<<"s3="<<s3<<endl;
s3+=s2;
cout<<"s3="<<s3<<endl;
cin>>s4;
cout<<"s4="<<s4<<endl;
s5=s3+s4;
cout<<"s5="<<s5<<endl;
s5[0]='g';
cout<<"s5="<<s5<<endl;
cout<<"strlen(s5)="<<s5.Length()<<endl;
cout<<boolalpha<<(s3==s1)<<endl;
cout<<boolalpha<<(s3<s1)<<endl;
return 0;
}
有什么问题欢迎交流,下面是结果