【带头学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++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对