C++自己写类 和 运算符重载函数

1.各类函数要求

1:析构函数,释放buf指向的堆空间

2:编写 append(const mystring r) 为当前字符串尾部,拼接新的字符串r

3:编写 isEqual(const mystring r) 判断当前字符串和 字符串 r是否相等

4.为mystring类补充深拷贝功能的拷贝构造函数

5.为mystring类补充: swap(另一个对象) 的函数,实现交换2个对象的字符串 mystring str = "hello" mystring ptr = "world" str.swap(ptr) str == "world",ptr == "hello"

2.各类运算符重载要求

为之前写的mystring类,添加 + 功能

:本质就是append str1 = "hello" str2 = "world" str3 = str1 + str2 == "helloworld"

+= 功能

= 深拷贝功能

== 功能

!= 功能

++ 功能,字符串中所有字符的ASCII自增1

[] 下表运算符 operator[](int index) 返回该下标上的字符 str = "hello" cout << str[0] ;终端输出 h

cout 输出mystring功能

cin 输入mystring功能

cpp 复制代码
using namespace std;
class mystring
{
    char * buf; //基本数据类型
public:
    mystring(const char * str); //绑定一个构造函数
    mystring(); //绑定另外一个构造函数
    ~mystring(); //析构函数
    void show(); //绑定显示方法
    void setmystring(const mystring r); // 设置字符串
    const char * getmystring()const; //获取当前字符串
    void append(const mystring r); //为当前字符串尾部拼接字符串r
    bool isEqual(const mystring r); //字符串比较否相等
    void swapmystring(mystring& r); //字符串交换
    mystring(const mystring& r); //深拷贝构造函数
    friend mystring operator+(mystring& ,const mystring& ); //加法运算符
    friend mystring operator+=(mystring& ,const mystring &); //复合运算
    mystring operator=(const mystring & r) //深拷贝功能 由于等号=不能放在外面 参数不和 需要写成类函数方法
    {
        int len = strlen(r.buf);
        this->buf = new char[len+1];
        strcpy(buf,r.buf);
        return *this;
    }
    friend bool operator==(const mystring& ,const mystring& ); //字符串相等函数
    friend bool operator!=(const mystring& ,const mystring& ); //字符串不等
    //++ 自增功能重载成字符串中的所有字符ASKII加1
    mystring& operator++()//前++
    {
        for(int i =0;buf[i] != '\0';i++)
        {
            buf[i]++;
        }
        return *this; //返回本身
    }
    mystring operator++(int)//后++
    {
        mystring temp = *this;
        ++(*this);
        return temp; //返回未加前
    }
    char& operator[](int index)  //下标运算符[]
    {
        return buf[index];
    }
    friend ostream& operator<<(ostream& ,const mystring&); //cout输出mystring
    friend istream& operator>>(istream& ,mystring&); //cin输入mtstring


};
//+运算符重载成字符串拼接函数
mystring operator+(mystring& l,const mystring& r)
{
    mystring temp;
    temp.buf = new char[strlen(l.buf)+strlen(r.buf)];
    strcpy(temp.buf,l.buf);
    temp.append(r);
    return temp;
}
//+=运算符重载成字符串追加函数
mystring operator+=(mystring& l,const mystring &r)
{
    l.append(r);
    return l;
}
// == 运算符重载成字符串相等函数
bool operator==(const mystring& l,const mystring& r)
{
    if(strcmp(l.buf,r.buf) == 0)
    {
        return 1;
    }
    return 0;
}
//!= 运算符重载成字符串不等函数
bool operator!=(const mystring&l,const mystring& r)
{
    if(strcmp(l.buf,r.buf) != 0)
    {
        return 1;
    }
    return 0;
}
//<<因为<<cout 是ostream的类 传入的参数应该ostream& 不能是this指针 不能写成类函数只能写在外部
//返回值是ostream类型的
ostream& operator<<(ostream& out,const mystring& r)
{
    out << r.buf ;
    return out;
}
//同理>>
istream& operator>>(istream& in,mystring& r)
{
    in >> r.buf;
    return  in;
}
mystring::~mystring() //析构函数
{
    free(buf);
}

mystring::mystring()  //无参构造函数
{
    buf = (char *)calloc(1,1);
}

mystring::mystring(const char * str) //有参构造函数
{
    int len = strlen(str);
    buf = (char *)calloc(1,len+1);
    strcpy(buf,str);
}

void mystring::show() //打印函数
{
    cout << buf << endl;
}

void mystring::setmystring(const mystring r) //设置当前字符串
{
    free(this->buf);
    int len = strlen(r.buf);
    this->buf = (char *)calloc(1,len+1);
    strcpy(this->buf,r.buf);
}

const char* mystring::getmystring()const //获取当前字符串
{
    return buf;
}

void mystring::append(const mystring r) //追加函数
{
    int m = strlen(this->buf);
    int n = strlen(r.buf);
    int len = m+n;
    char* temp = buf;
    buf = (char* )calloc(1,len+1);
    strcpy(buf,temp);
    free(temp);
    strcat(buf,r.buf);
}

bool mystring::isEqual(const mystring r) //判断是否相等
{
    return strcmp(buf,r.buf) == 0;
}

void mystring::swapmystring(mystring& r) //字符串交换函数
{
    char* temp = this->buf;
    this->buf = r.buf;
    r.buf = temp;
}
mystring::mystring(const mystring& r) //深拷贝构造函数
{
    int len = strlen(r.buf);
    buf = (char* )calloc(1,len+1);
    strcpy(buf,r.buf);
}

int main()
{
    //+测试
    mystring str1 = "hello";
    mystring str2 = "world!";
    mystring str3 = str1 + str2;
    str3.show();
    //+=测试
    mystring str4 = "godbay";
    mystring str5 = "nono";
    str4 += str5;
    str4.show();
    //=测试
    mystring str6 ="nihao";
    str6 = "nibuhao";
    str6.show();
    //==测试
    if(str6 == str5)
    {
        cout << "相等" << endl;
    }
    else {
        cout << "不等" << endl;
    }
    //!=测试

    if(str5 != str6)
    {
        cout << "不相等" << endl;
    }
    else {
        cout << "相等" << endl;
    }
    //[]下标运算符测试
    cout << str1[0] << endl;
    //测试cout cin
    mystring str8;
    mystring str9 = "下班下班,回家睡觉了";
    cin >>  str8;
    cout << str9 << endl;
    /*str.show();
    ptr.setmystring(str);
    ptr.show();


    ptr.setmystring("godbay,world!");
    ptr.show();

    str.append(ptr);
    str.show();

    if(str.isEqual(ptr))
    {
        cout << "str = ptr" << endl;
    }
    */

    return 0;
}
相关推荐
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
一只小bit4 小时前
C++之初识模版
开发语言·c++
CodeClimb5 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
北顾南栀倾寒7 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
old_power8 小时前
【PCL】Segmentation 模块—— 基于图割算法的点云分割(Min-Cut Based Segmentation)
c++·算法·计算机视觉·3d
涛ing9 小时前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
PaLu-LI10 小时前
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
c++·人工智能·opencv·学习·ubuntu·计算机视觉