【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易,麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜!献舞一支!❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

目录

9.13.9设计MyString案例

问题1:当遇见中括号时,访问字符串某个位置的字符?

问题2:实现对字符串赋值怎么办?

问题3:直接输出str,可以吗?

问题4:使用 cin >> 输入流输入一个字符串进行打印

问题5:重载+加法,追加字符串

问题6:如何实现赋值 = 呢?

问题7:如何比较两个字符串的大小?实现下面这个比较的结果

点赞  + 收藏 + 关注


9.13.9设计MyString案例

        现在我们结合之前笔记学习内容,设计一个MyString的类,进行自主的调用,自己写一些方法,获取字符串的大小,重载运算符,使用一些特殊的重载符号,构建一个自定义的MyString字符串操作的类。在这之前,我们先了解问题,分析问题,最后文末会贴出完整代码,这里主要是思路,发现需求,定义解决需求的方法思路值得学习。

基础定义结构:在这个基础上进行增加需求,增加扩展(开发思路!)

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第1张图片

问题1:当遇见中括号时,访问字符串某个位置的字符?

 1、声明 [ ] 函数

2、定义 [ ] 函数 

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第2张图片

 3、定义有参构造函数:实现拷贝字符串,获取字符串的大小

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第3张图片

4、定义其他函数

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第4张图片  无参构造

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第5张图片 拷贝构造

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第6张图片 获取字符串大小长度

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第7张图片析构函数,释放指针成员空间

5、main函数创建对象,调用数组查找字符:看结果(√)

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第8张图片

 问题2:实现对字符串赋值怎么办?

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第9张图片

 在1问题答案基础上增加引用

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第10张图片

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第11张图片

 问题3:直接输出str,可以吗?

 

此时和之前所学一样,可以采用一个全局函数实现重载输出运算符

此时的ob没有增加引用,为了避免后面加法出问题

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第12张图片

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第13张图片

 结果:【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第14张图片

问题4:使用 cin >> 输入流输入一个字符串进行打印

同问题三差不多,就是需要一个cin输入,一个字符拷贝过程,拷贝前判空清空,全局函数增加友元

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第15张图片

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第16张图片

 问题5:重载+加法,追加字符串

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第17张图片

此时可以考虑使用成员函数实现:左边是一个对象,右边也是一个对象,可以省略一个。

声明:

定义: 

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第18张图片

测试结果:

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第19张图片

 问题6:如何实现赋值 = 呢?

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第20张图片

 定义重载赋值运算符:【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第21张图片

  声明实现:

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第22张图片

结果: 

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第23张图片

问题7:如何比较两个字符串的大小?实现下面这个比较的结果

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第24张图片

声明:

定义:

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第25张图片

结果: 

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第26张图片

 完整代码:main.cpp

#include 
#include 
#include 

using namespace std;

class MyString
{
    friend ostream& operator<<(ostream &out, MyString ob);
    friend istream& operator>>(istream &in, MyString &ob);
private:
    char *str;//指向字符串的首地址
    int size;//字符串的大小
public:
    MyString();//无参构造
    MyString(const char *str);//有参构造
    MyString(const MyString&ob);//拷贝构造,有指针成员,要手动的实现深拷贝
    ~MyString();

    int getSize();//获取大小

    char& operator[](int pos);

    MyString operator+(MyString &ob);
    MyString operator+(const char *str);

    //重载赋值运算符 (只有指针成员operator=必须深拷贝) 类中有指针成员时候必须要重新这个,实现深拷贝
    MyString& operator=(MyString ob);
    MyString& operator=(char *str);

    bool operator>(MyString ob);
    bool operator>(char *str);
};

ostream& operator<<(ostream &out, MyString ob)
{
    out<>(istream &in, MyString &ob)
{
    char buf[128]="";
    cin>>buf;
    //判断ob.str是否为NULL
    if(ob.str != nullptr)
    {
        delete [] ob.str;
        ob.str=nullptr;
    }

    ob.size = strlen(buf);//获取输入字符串的大小
    ob.str = new char[ob.size+1];//申请空间
    memset(ob.str, 0, ob.size+1) ;//清空该空间,确保里面没东西
    strcpy_s(ob.str, ob.size+1, buf);//把缓存的buf拷贝给str
    return in;
}
int main()
{
    MyString str1 = "Hello";
    str1[1] = 'E';
    cout<>str2;
    cout << str2 << endl;

    //加法重载,自定义MyString类
    MyString str3 = "Tom";
    MyString str4 = "Jery";
    cout< str6)
    {
        cout<<"大于"<
    this->str = new char[sizeof(str)+1];
    memset(this->str,0,strlen(str)+1);
    size = strlen(str);
    strcpy(this->str,str);
}

MyString::MyString(const MyString &ob)
{
    size = ob.size;
    str = new char[size+1];
    memset(str,0,size+1);
    strcpy(str,ob.str);
}

MyString::~MyString()
{
    if(str != nullptr)
    {
        delete [] str;
        str = nullptr;
    }
}

int MyString::getSize()
{
    return size;
}

char& MyString::operator[](int pos)
{
    //先判断是否越界
    if(pos <=0 && pos >= size)
    {
        cout<<"下标越界"<size + ob.size;
    tmp.str = new char[tmp.size +1];
    memset(tmp.str, 0, tmp.size+1);
    strcpy(tmp.str, this->str);
    strcat(tmp.str, ob.str);

    return tmp;
}

MyString MyString::operator+(const char *str)
{
    MyString tmp;
    tmp.size = this->size + strlen(str);
    tmp.str = new char[tmp.size + 1];
    memset(tmp.str, 0, tmp.size + 1);
    strcpy(tmp.str, this->str);
    strcat(tmp.str, str);

    return tmp;
}


MyString &MyString::operator=(MyString ob)
{
    if(str != nullptr){
        delete [] str;
        str = nullptr;
    }

    size = ob.size;

    str = new char[size+1];
    memset(str,0,size+1);
    strcpy(str,ob.str);

    return *this;
}

MyString &MyString::operator=(char *str)
{
    if(this->str != nullptr){
        delete [] this->str;
        this->str = nullptr;
    }

    size = strlen(str);

    this->str= new char[size+1];
    memset(this->str,0,size+1);
    strcpy(this->str,str);

    return *this;
}

bool MyString::operator>(MyString ob)
{
    if(str == nullptr || str == nullptr)
    {
        exit(-1);
    }

    if(strcmp(str, ob.str) > 0)
        return true;
    return false;
}

bool MyString::operator>(char *str)
{
    if(this->str == nullptr || this->str == nullptr)
    {
        exit(-1);
    }

    if(strcmp(this->str, str) > 0)
        return true;
    return false;
}

 + 收 +

❤️您的支持❤️是我最大的动力❤️相互学习❤️共同进步❤️一起搞钱❤️动动发财的小手❤️

  ⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️十星好评,Erike的专用模板⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️ 

什  么 ?您  要  打  赏 ?谢    谢    老   板!老    板    大    气! 

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例_第27张图片

你可能感兴趣的:(C++从基础到抗大旗,c++,开发语言,面试,c语言,算法)