运算符重载-Cstring

这里实现的Cstring就是C++库中的近容器string

class Cstring
{
public:
     Cstring(char *p=NULL)//构造函数 带一个参数或不带参数的构造
     {
         if (p != NULL)
         {
             mpstr=new char[strlen(p)+1];
             strcpy(mpstr,p);
         }
         else
         {
             mpstr=new char[1];
             *mpstr=0;
         }
     }
     Cstring(const Cstring &src)//因为会发生浅拷贝 所以需要自己定义拷贝构造函数
     {
        mpstr =new char[strlen(src.mpstr)+1];
        strcpy(mpstr,src.mpstr);

     }
     Cstring & operator=(const Cstring &src)//赋值运算符重载
     {
         if (this == &src) //防止自赋值
         {
             return *this;
         }

         delete []mpstr; //释放原来空间
         mpstr=NULL;

         mpstr = new char[strlen(src.mpstr) + 1];
         strcpy(mpstr,src.mpstr);
         return *this;
     }
     ~Cstring()//析构
     {
         delete []mpstr;
         mpstr=NULL;
     }
     bool operator >(const Cstring &src)//大于运算符的重载
     {
         return strcmp(mpstr,src.mpstr) > 0 ? true:false;
     }

     bool operator <(const Cstring &src)//小于运算符的重载
     {
          return strcmp(mpstr,src.mpstr) < 0 ? true:false;
     }

     bool operator == (const Cstring &src)//等于运算符的重载
     {
          return strcmp(mpstr,src.mpstr) == 0 ? true:false;
     }
     //求字符串长度大小
     unsigned int size()const{return strlen(mpstr);}

     //[]运算符的重载函数  [] * ->

     char & operator[](int i){ return mpstr[i];}

     //这里char & 之前加const 主要是因为防止参数被修改 只读的“hello”字符串常量不能被修改
     const char & operator[](int i)const {return mpstr[i];}
     //返回当前指针
     const char * c_str()const{return mpstr;}

private:

    char* mpstr;

    friend Cstring operator+(const Cstring &left,const Cstring &right);
    friend ostream &operator<<(ostream &out,const Cstring &src);
    friend istream &operator>>(istream &in,Cstring &src);//输入的src不具备const常性
};
//CString str4 = str3 + "world";
//字符串的连接   这里要注意防止内存泄漏 释放ptmp
Cstring operator+(const Cstring &left,const Cstring &right)
{
    int size=strlen(left.mpstr)+strlen(right.mpstr)+2;
    char * ptmp= new char[size];
    strcpy(ptmp,left.mpstr);
    strcat(ptmp,right.mpstr);
    Cstring tmp(ptmp);

    delete[]ptmp;//手动释放
    return tmp;//会调用析构

}

ostream &operator<<(ostream &out,const Cstring &src)
{
    out<<src.mpstr;
    return out;
}

istream &operator>>(istream &in,Cstring &src)
{
   in>>src.mpstr;
   return in;
}

int main()
{
    Cstring str1("hello");
    Cstring str2 = str1 + "world";
    Cstring str3 = "china"+ str2;
    Cstring str4 = str1 + str3;
    cout << "str1:"<<str1 << endl;
    cout <<"str2:"<<str2 << endl;
    cout << "str3:" << str3 << endl;
    cout << "str4:" << str4 << endl;

    if (str1 > str2)
    {
        cout<<"str1 > str2"<<endl;
    }
    else if (str1 < str2)
    {
        cout<<"str1 < str2"<<endl;
    }
    else
    {
       cout<<"str1 == str2"<<endl;
    }

    int size = str1.size();
    for (int i = 0; i < size; ++i)
    {
        // str1.operator[](i)   char& operator[](int i)
        cout << str1[i];
    }
    cout << endl;

     Cstring   ->   char*
    char buffer[1024] = { 0 };
    strcpy(buffer, str1.c_str());
    cout << buffer << endl;

    return 0;
}

执行之后的结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的字符串重载通常是指对字符串类的运算进行重载,使得字符串对象可以像基本数据类型一样进行运算。例如,可以对字符串的加法运算进行重载,使得两个字符串对象可以通过“+”号进行拼接。 下面是一个简单的字符串类的定义和加法运算符重载的示例代码: ```cpp #include <cstring> #include <iostream> class String { public: String() : data(nullptr), length(0) {} String(const char* s) : data(nullptr), length(0) { if (s != nullptr) { length = strlen(s); data = new char[length + 1]; strcpy(data, s); } } ~String() { if (data != nullptr) { delete[] data; } } String operator+(const String& other) const { String result; result.length = length + other.length; result.data = new char[result.length + 1]; strcpy(result.data, data); strcat(result.data, other.data); return result; } friend std::ostream& operator<<(std::ostream& os, const String& str) { os << str.data; return os; } private: char* data; size_t length; }; int main() { String s1("Hello"), s2("world"); String s3 = s1 + s2; std::cout << s3 << std::endl; return 0; } ``` 在上面的代码中,我们定义了一个简单的字符串类`String`,它包含了一个字数组`data`和字符串的长度`length`。我们对加法运算进行了重载,使得两个字符串对象可以通过“+”号进行拼接,并返回一个新的字符串对象。在重载函数中,我们首先创建一个新的字符串对象`result`,然后计算拼接后的长度,为`result`分配足够的内存,将两个原始字符串拷贝到`result`中,并返回`result`对象。 最后,我们定义了一个友元函数`operator<<`,用于输出字符串对象的内容。 需要注意的是,在实现字符串重载时,需要考虑到内存的分配和释放问题,避免内存泄漏和悬空指针等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值