【带头学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

相关文章

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的