第八周上机实践项目4-String类的构造(减法精简了一些哦)

写一个能处理字符串的类,其数据成员如下所示:

class String  
{  
public:
   ...//需要的成员函数(若需要的话,声明友元函数)
private:  
    char *p;   //指向存储的字符串 
    int len;   //记录字符串的长度  
};  

请构造String类的加、减运算。其中,s1 + s2将两个字符串的连接起来;s1 - s2是将s1的尾部空格和s2的前导空格去除后的连接。
提示:有指针成员,设计时要注意。这个,你懂的。

程序如下:

<span style="font-size:14px;">#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class String
{
public:
    //需要的成员函数(若需要的话,声明友元函数)
    String(char *a)
    {
        len=strlen(a);
        p=new char[len+1];  //(a)这样处理的意义在于:杜绝野指针,使程序能正常运行
        strcpy(p, a);  //(b)数据成员a与形式参数aa的关系:a保存和aa一样的地址
    }
    String()
    {
        len=0;
        p=NULL;
    }
    void output()
    {
        cout<<p<<endl;
    }
    friend String operator + (String &s1,String &s2);
    friend String operator - (String &s1,String &s2);
private:
    char *p;   //指向存储的字符串
    int len;   //记录字符串的长度
};
String operator + (String &s1,String &s2)
{
    String s;
    s.len=s1.len+s2.len;
    s.p=new char[s.len+1];
    strcpy(s.p,s1.p);
    strcat(s.p,s2.p);//strcat与strcpy的使用:strcat是用来连接两个字符串的,strcpy是复制并覆盖的
    return s;
}
String operator - (String &s1,String &s2)
{
    String s3,s4,s;
    char *i=s1.p,*j=s2.p;
    int k=strlen(i),m;
    while(i[k-1]==' ')
    {
        i[k]='\0';
        k--;
    }
    i[k]='\0';
    s3.p=i;
    s3.len=k;
    for(m=0;*j==' ';j++,m++);
    s4.p=j;
    s4.len=s2.len-m;
    s=s3+s4;
    return s;
}
int main()
{
    String s1(" manxcc is tall.   "),s2("       see you again "),s3;
    s1.output();
    s2.output();
    cout<<"s1+s2=";
    s3=s1+s2;
    s3.output();
    cout<<"s1-s2=";
    s3=s1-s2;
    s3.output();
    return 0;
}</span>
图片:


心得:

本以为很简单的小程序,没想到里面这么绕。。。忘了这个忘了那个的。。。

没设计析构函数,本来写的是

~String
{
       if(p!=NULL)
             delete []p;
}
但是这样运行出来的结果不对,我也很纠结,就没写。。。

减法参考了以前做的一道关于去掉字符串开头空格的项目,单独把s2.p末尾空格去掉,再把s1.p开头空格去掉,然后使用String类的加法就OK了~~~

简单大气!是我的风格!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值