【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例
2023-12-14 16:32:27
??????????????????????创做不易,麻烦点个关注????????????????????????
??????????????????文末有惊喜!献舞一支!????????????????????
目录
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是否为NULL if(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拷贝给str return 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的专用模板?????????????????????
什 ?么 ?您 ?要 ?打 ?赏 ?谢 ? ?谢 ? ?老 ? 板!老 ? ?板 ? ?大 ? ?气!?
文章来源:https://blog.csdn.net/Phofomy/article/details/134977657
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!