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

news2024/11/25 12:55:19

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

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

目录

9.13.9设计MyString案例

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

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

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

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

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

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

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

点赞👍  + 收藏👐 + 关注👌


9.13.9设计MyString案例

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

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

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

 1、声明 [ ] 函数

2、定义 [ ] 函数 

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

4、定义其他函数

  无参构造

 拷贝构造

 获取字符串大小长度

析构函数,释放指针成员空间

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

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

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

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

 

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

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

 结果:

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

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

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

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

声明:

定义: 

测试结果:

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

 定义重载赋值运算符:

  声明实现:

结果: 

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

声明:

定义:

结果: 

 完整代码:main.cpp

#include <iostream>
#include <string.h>
#include <string>

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<<ob.str<<endl;
    return out;
}
istream& operator>>(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<<str1[1]<<endl;

    cout << str1 << endl;

    MyString str2;
    cin>>str2;
    cout << str2 << endl;

    //加法重载,自定义MyString类
    MyString str3 = "Tom";
    MyString str4 = "Jery";
    cout<<str3+str4<<endl;
    cout<<str3+"Spike"<<endl;

    MyString str5 = "Tomlove";
    MyString str6 = "Haaa";
    str6 = str5;
    cout << str6 << endl;
    str6 = "ZZZ";
    cout << str6;
    //判断是否大于
    if(str5 > str6)
    {
        cout<<"大于"<<endl;
    }else{
        cout<<"不大于"<<endl;
    }
    return 0;
}

MyString::MyString()
{
    str = nullptr;
    size = 0;
}

MyString::MyString(const char *str)
{
   //相同名,使用this->
    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<<"下标越界"<<endl;
        exit(-1);
    }
    return str[pos];
}

MyString MyString::operator+(MyString &ob)
{
    MyString tmp;
    tmp.size = this->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的专用模板⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️ 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1311976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ps:曲线的基本操作

在曲线上通过添加控制点&#xff0c;然后拖动或编辑这些控制点就可实现对图像的精细调整。 添加控制点 方法一&#xff1a; 直接在曲线上点击&#xff0c;即可添加控制点。 方法二&#xff1a; 使用目标调整工具时&#xff0c;在图像上单击&#xff0c;即可添加控制点。若按住并…

【重点】23.合并K个升序链表

题目 法1&#xff1a;分治合并 class Solution {public ListNode mergeKLists(ListNode[] lists) {return merge(lists, 0, lists.length - 1);}public ListNode merge(ListNode[] lists, int l, int r) {if (l > r) {return null;}if (l r) {return lists[l];}int mid l…

我对迁移学习的一点理解——领域适应(系列3)

文章目录 1. 领域适应&#xff08;Domain Adaptation&#xff09;的基本概念2.领域适应&#xff08;Domain Adaptation&#xff09;的目标3.领域适应&#xff08;Domain Adaptation&#xff09;的实现方法4.领域适应&#xff08;Domain Adaptation&#xff09;的可以解决的问题…

VRRP协议与原理

文章目录 VRRP协议与原理一、VRRP 协议二、单网关和多网管的缺陷1、单网关缺陷2、多网管的缺陷 三、VRRP基本概述四、VRRP工作原理1、VRRP主备份备份工作工程2、VRRP 主备路由器切换过程3、VRRP 负载分担工作过程 五、VRRP配置命令1、vrrp配置命令2、配置VRRP步骤&#xff1a; …

汽车EDI:Chrysler EDI项目案例

菲亚特克莱斯勒汽车Fiat Chrysler Automobiles(FCA)是一家全球性汽车制造商&#xff0c;主营产品包括轿车、SUV、皮卡车、商用车和豪华车等多种车型。其旗下品牌包括菲亚特、克莱斯勒、道奇、Jeep、Ram、阿尔法罗密欧和玛莎拉蒂等。 Chrysler通过EDI来优化订单处理、交付通知、…

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数

目录 一、编写程序&#xff0c;输入三个字符串&#xff0c;比较它们的大小&#xff0c;并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用&#xff0c;并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数&#xff0c;并自己模拟strcmp。 …

1846_安全SPI

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/g_embedded: some embedded basic knowledge. 1846_安全SPI SPI是一种常见的通信方式&#xff0c;在汽车电子中比较常用。但是如果涉及到安全相关的设计&#xff0c;可能得考虑更多。而SPI协议本身没有很好的标准化&am…

福德机械:植保无人机的领航者

亲爱的读者们&#xff0c;欢迎来到福德机械的神奇世界。在这个充满活力和创新的世界里&#xff0c;我们专注于植保无人机的发展与应用&#xff0c;以实现农业现代化、智能化和高效化的目标。植保无人机&#xff0c;作为一种高效、环保和安全的农业工具&#xff0c;已经逐渐成为…

大数据----32.hbase高可用的演示

1、概述&#xff1a;Hbase的优缺点和适用场景 优点&#xff1a;HBase 底层基于HDFS存储&#xff0c;高可用、高扩展、强一致性&#xff0c;支持上亿级别数据。 10亿数据 性能测试结果 写性能&#xff1a;集群吞吐量最大可以达到70000 ops/sec&#xff0c;延迟在几个毫秒左右。…

摄影预约小程序制作实战教程

在如今的移动互联网时代&#xff0c;小程序成为了各行业推广和服务的重要工具之一。而对于摄影行业来说&#xff0c;一个专业的摄影预约小程序无疑是提高服务质量和用户体验的关键。 为了让大家更便捷地制作摄影预约小程序&#xff0c;本文将介绍一种使用【乔拓云】第三方制作平…

钉钉机器人发送表格

背景: 由于每次发送excel连接&#xff0c;不太好看&#xff0c;想着简单的表格直接用消息的方式发送在群里&#xff0c;就想着弄一个直接发送的表格信息&#xff0c;但是钉钉官网是没有的。 我估计钉钉的开发人员也没有想过&#xff0c;会有人钻空子&#xff0c;用markdown发送…

天翼云盘秒变硬盘分享

https://cloud.189.cn/web/share?codeAvUnqaj6NNza&#xff08;访问码&#xff1a;wf4r&#xff09;y 以下介绍为作者开发的单机版软件&#xff0c;可用于Windows环境中将天翼云盘挂载为本地硬盘&#xff0c;确实可以达到本地硬盘的使用感知&#xff0c;对于多终端数据副本一…

【RocketMQ】顺序消费消息实现原理分析

一、顺序消息概述 1.1、什么是顺序消息 顺序消息是指对于一个指定的 Topic &#xff0c;消息严格按照先进先出&#xff08;FIFO&#xff09;的原则进行消息发布和消费&#xff0c;即先发布的消息先消费&#xff0c;后发布的消息后消费。 1.2、顺序消息的类型 全局顺序消息 …

【网络安全】网络防护之旅 - 对称密码加密算法的实现

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《网络安全之道 | 数字征程》⏰墨香寄清辞&#xff1a;千里传信如电光&#xff0c;密码奥妙似仙方。 挑战黑暗剑拔弩张&#xff0c;网络战场誓守长。 目录 &#x1f608;1. 初识网络安…

性能提升100%、存储节约50%!猕猴桃游戏搭载OceanBase开启云端手游新篇章

近日&#xff0c;武汉灵动在线科技有限公司&#xff08;以下简称“灵动在线”&#xff09;与 OceanBase 达成合作&#xff0c;旗下品牌猕猴桃游戏的“游戏用户中心&#xff08;微信小程序&#xff09;”和“BI 分析报表业务系统“两大关键业务系统全面接入 OB Cloud 云数据库&a…

中国企业领袖年会在京举行,天雨设计左明龙应邀出席参加

12月9-11日&#xff0c;第二十一届中国企业领袖年会在中国大饭店隆重举行。本届领袖年会以“致敬长期主义”为主题&#xff0c;逾百名世界500强、中国500强和行业领军企业家受邀汇聚一堂&#xff0c;共话中国经济未来。北京天雨盛世文化传媒有限公司&#xff08;以下简称“天雨…

Ubuntu如何安装KVM

环境&#xff1a; 联想E14笔记本 Ubuntu20.04 问题描述&#xff1a; Ubuntu如何安装KVM 解决方案&#xff1a; 1.验证CPU是否支持硬件虚拟化 rootst-ThinkPad-E14:~# grep -Eoc (vmx|svm) /proc/cpuinfo 162.检查 VT 是否在 BIOS 中启用 安装 apt install cpu-checker …

软件设计师——软件工程(二)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

利用svm进行模型训练

一、步骤 1、将文本数据转换为特征向量 &#xff1a; tf-idf 2、使用这些特征向量训练SVM模型 二、代码 from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC from sklearn.m…

如何有效利用餐厅预约小程序推广餐厅品牌

随着餐饮行业竞争的加剧&#xff0c;餐厅订座预约成为了吸引顾客的一种重要方式。而微信小程序作为移动互联网的重要入口之一&#xff0c;为餐厅提供了一个方便快捷的预约平台。本文将介绍如何使用乔拓云平台等第三方小程序制作平台来开发餐厅订座预约微信小程序。 首先&#x…