【带头学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++使用printf语句实现进制转换的示例代码

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

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

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

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++