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

2023-12-17 23:01

本文主要是介绍【带头学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字符串操作的类。在这之前,我们先了解问题,分析问题,最后文末会贴出完整代码,这里主要是思路,发现需求,定义解决需求的方法思路值得学习。

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

问题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是否为NULLif(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拷贝给strreturn 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的专用模板⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️ 

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

这篇关于【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/506175

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化