c++实验四:多态性

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<<(s3
s1)<<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;
}

有什么问题欢迎交流,下面是结果
这是运行结果

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值