当前位置: 首页 > news >正文

用C++编写一个MyString类

 1.平台:vs2019

2.很多知识点写在了代码里

class MyString
{
private:char* str;MyString(char* p, int x){str = p;}
public:MyString(const char* p = nullptr) :str(nullptr){if (p != nullptr){int len = strlen(p) + 1;str = new char[len];strcpy_s(str, len, p);}else{str = new char[1];str[0] = '\0';//空字符串}}MyString(const MyString& s) :str(nullptr)//拷贝构造{if (s.str != nullptr){int len = strlen(s.str) + 1;str = new char[len];strcpy_s(str, len, s.str);}}MyString& operator=(const MyString& s)//赋值运算符重载有4中情况 0  0    0  1   1  0      1 1{if (this != &s){delete[]str;int len = strlen(s.str) + 1;//strlen不能计算空字符串的长度str = new char[len];strcpy_s(str, len, s.str);}return *this;}~MyString(){delete[]str;str = nullptr;}MyString operator+(const MyString& s)const//这里不能以引用返回,引用返回相当于是地址,函数调用完成之后,地址消失{int len = strlen(str) + 1 +strlen(s.str);char*ps = new char[len];strcpy_s(ps, len, str);strcat_s(ps, len, s.str);//只用放一个\0。前面加了两次1 所以这里减1return MyString(ps,1);}MyString operator+(const char* s)const{//return *this + MyString(s);//  第一种int len = strlen(this->str) + 1 + strlen(s);char* ps = new char[len];strcpy_s(ps, len, this->str);strcat_s(ps, len,s);//只用放一个\0。前面加了两次1 所以这里减1return MyString(ps, 1);}MyString& operator+=(const MyString &s){int len = strlen(this->str) + 1 + strlen(s.str);char* tmp = this->str;this->str = new char[len];strcpy_s(str, len, tmp);strcat_s(str, len, s.str);//只用放一个\0。前面加了两次1 所以这里减1delete[]tmp;return *this; //掉一个私有的构造函数,这个函数只是自己用}char* Get(){return str;}const char* Get()const{return str;}void Print(){cout << "str    " << str << endl;}size_t Size()const { return strlen(str); }char &operator[](const int pos)//普通方法 这里不能直接在后面加const的原因是前面以引用返回,我们可以修改它的值,这里加了const就不允许修改值了{assert(pos >= 0 && pos < Size());return str[pos];}const char& operator[](const int pos)const//常方法,本来就是传常对象那么就不可以更改它的值,所以返回值加const{assert(pos >= 0 && pos < Size());return str[pos];}friend MyString operator+(const char* s, const MyString& p);friend ostream& operator <<(ostream& out, const MyString& s);friend istream& operator>>(istream& in, MyString& s);
};
MyString operator+(const char* s, const MyString& p)
{//return MyString(s) + p;int len = strlen(p.str) + 1 + strlen(s);char* ps = new char[len];strcpy_s(ps, len,s);strcat_s(ps, len, p.str);//只用放一个\0。前面加了两次1 所以这里减1return MyString(ps, 1);
}
ostream& operator<<(ostream& out, const MyString& s)
{cout << s.str;return out;//实现空行}
istream& operator>>(istream& in, MyString& s)//这里存在设置大小的问题,还没有解决
{delete[]s.str;s.str = new char[256];//这里如果给大了,会产生浪费,给小了可能不够,思考解决这个问题int len = 256;in.getline(s.str, len);return in;
}
void main()
{MyString s1("yh");MyString s2("hello");MyString s3;//operator<<(cout,s2);cout << s2 << endl;cout << s1 << endl;//s3 = s1;//s3.Print();//s1.Print();//s3 = s1 + s2;//s3.Print();//s3 = "new" + s1;//s3.Print();//s3 = s2 + "new";//s3.Print();//s3 = s1 += s2;//s3.Print();char ch = s1[0];//cout << ch << endl;s1[0] = 'x';//引用返回创建了副本,返回别名就可以修改//s1.Print();
}

http://www.lryc.cn/news/99975.html

相关文章:

  • Linux C语言中access函数的用法
  • c# winform 子窗体关闭时主窗体执行指令
  • vue-simple-uploader的fileAdded方法不支持异步的解决办法,autoStart 设置
  • WormGPT – 网络犯罪分子用来犯罪的人工智能工具
  • 【NLP】语音识别 — GMM, HMM
  • 中间件面试题
  • PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案
  • 【Docker】Docker应用部署之Docker容器安装Redis
  • 【C++】STL——list的介绍和使用、list增删查改函数的介绍和使用、push_back、pop_back
  • “RWEQ+”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践
  • ChatGPT在智能推送和个性化广告中的应用如何?
  • 科技的成就(四十八)
  • spring5高级49讲
  • MacOS本地安装Hadoop3
  • 十五章:使用类别峰值响应的弱监督实例分割
  • 自然语言处理从入门到应用——LangChain:模型(Models)-[聊天模型(Chat Models):基础知识]
  • Asp.Net 使用Log4Net (SQL Server)
  • Vue2基础五、工程化开发
  • 发现 ModStartCMS:构建梦想网站的全新选择
  • 大数据Flink(五十二):Flink中的批和流以及性能比较
  • 【MySQL】MySQL索引、事务、用户管理
  • 函数重载与引用
  • 如何快速模拟一个后端 API
  • DLA :pytorch添加算子
  • Java特殊时间格式转化
  • 在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)
  • 后台管理系统中常见的三栏布局总结:使用element ui构建
  • SpringCloud学习路线(10)——分布式搜索ElasticSeach基础
  • CSS翻转DIV展示顺序
  • python 源码中 PyId_stdout 如何定义的