本文主要是介绍【带头学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类案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!