第12周实践项目-String类
来源:互联网 发布:excel表去掉重复数据 编辑:程序博客网 时间:2024/06/04 01:16
问题描述及代码:
#include <iostream>#include <cassert>#include <cstring>using namespace std;class String{private: char* p; int len;public: String(); String(const char* s); String(const String& s); ~String();//问题出现在这儿 void show(); friend String operator+(const String& s1,const String& s2); friend String operator-(String& s1,String& s2); String& operator=(String s);};String::String(){ len=0; p=NULL;}String::String(const char* s){ len=strlen(s); p=new char[len+1]; strcpy(p,s);}String::String(const String& s){ len=s.len; if(p!=NULL)delete []p; p=new char[len+1]; strcpy(p,s.p);}String operator+(const String& s1,const String& s2){ String total; total.len=s1.len+s2.len; total.p=new char[total.len+1]; strcpy(total.p,s1.p); strcat(total.p,s2.p); return total;}String operator-(String& s1,String& s2){ String s; char* c1=new char[s1.len+1]; strcpy(c1,s1.p); int i=s1.len-1; while(c1[i]==' '&&i>=0)--i; c1[i+1]='\0'; char* c2=new char[s2.len+1]; strcpy(c2,s2.p); i=0; while(i<s2.len&&c2[i]==' ')++i; int j=0; while(c2[i]!='\0'&&i<s2.len) { c2[j]=c2[i]; ++i; ++j; } c2[j]='\0'; //s.len=s1.len+s2.len+2; s.len=strlen(c1)+strlen(c2); s.p=new char[s.len+1]; strcpy(s.p,c1); strcat(s.p,c2); delete c1; delete c2; return s;}String& String::operator=(String s){ if(!this->p) delete []p; p=new char(s.len+1); strcpy(p,s.p); len=s.len; return *this;}void String::show(){ cout<<p<<endl;}String::~String(){ delete []p;}int main(){ String str1("123 "),str2(" 456"),str3; str3=str1+str2; str3.show(); //str3=str1-str2; //str3.show(); return 0;}
运行结果:
这个是在我注释掉了str1-str2之后运行得到的结果。
之前遇到的单步调试直接跳到析构函数的情况没有了,但是并没有修改代码(好奇怪哦。。)
根据贺老师的提示我增加了=的运算符重载,输出正常了,但str1-str2一直得不到正确的结果,而且会出现运行结束的框框。。
ps:
老师给出的=运算符重载的代码是
String &String::operator=(const String &s1){ if(!this->p) delete []p; p=new char(s1.len+1); strcpy(p,s1.p); len=s1.len; return *this;}
但我认为这里不用引用类型的返回值比较好,因为前面实现的+运算符重载的返回值不是引用,也就是要生成一个临时的空间来存放结果,这里用引用的话是不是不恰当类?嘿嘿
那个 - 运算符重载的问题目前还在找,可能跟内存有关,如果大家有人知道原因请告诉我。。
1 0
- 第12周实践项目-String类
- 第12周上机实践项目1
- 第12周项目4-String类的构造
- 第12周项目4-string类的构造
- 第12周项目4-String类的构造
- 第8周项目--string 类
- 第8周项目4-string类
- 第十二周上机实践项目4:String类的构造
- 第12周实践项目3-图遍历算法实现
- 第14周实践项目-数组类模板
- 第14周实践项目-两个成员的类模板
- 第12周上机实践项目3——日期时间类
- 第12周实践项目(4)-数组类运算的实现
- 第3周实践项目-3
- 第4周实践项目2-单链表
- 第13周实践项目-Dijkstra算法
- 第15周实践项目-哈希表
- 第15周实践项目-希尔排序
- 第十四周项目—阅读并运行程序,解释程序执行得到的结果(1)
- 关于那些莫名其妙的问题
- 跟我一起学Microsoft SQL Server 2012 Internals(3.4)
- CollectionView如何按行排列
- 二叉堆的实现
- 第12周实践项目-String类
- cocos2d-x android 直接加载下载到sd的zip里的资源文件(一)
- 城市列表<使用百度定位>
- mapreduce运行机制
- 使用MIT App Inventor 2开发Android应用
- 从 setNeedsLayout 说起
- Android源码下载
- Extjs gridPanel 小计保存不上
- Java网络编程(一) - Java网页爬虫 - 爬取自己的CSDN博客标题和阅读数(附源码)