const int MS=100;
class mystring{char *str;        //存放字符串的数组容器int maxsize;          //最大可用元素数,可防止数组出界,提高健壮性int last;              //已用元素最大下标
public:mystring();mystring(char *s);mystring(mystring & st);~mystring();void show();char & operator[](int i);mystring &operator=(const mystring &);mystring & operator=(char * st);//这里重载的=是把C风格字符串赋给mystringmystring operator+(mystring &);mystring operator+=(mystring &);bool operator<(mystring &);bool operator==(mystring &);
};
mystring::mystring()
{last=0;maxsize =MS;str=new char[last];str[last]=0;cout<<"缺省构造函数"<<endl;
}
mystring::mystring(char *s)//当C字符串过长,初始化时采用截尾处理
{last=0;maxsize =MS;str=new char[strlen(s)+1];//s的长度没有包括\0do{str[last]=s[last];last++;}while(s[last]!='\0'&&last<maxsize-1);str[last] ='\0'; //截尾处理时,必须加串结束符cout<<"构造函数"<<endl;
}
mystring::mystring(mystring & st)
{last=0;maxsize =MS;str=new char[st.last+1];//s的长度没有包括\0//重新指向动态内存do{str[last]=st.str[last];last++;}while(st.str[last]!='\0'&&last<maxsize-1);str[last]='\0';cout<<"拷贝构造函数"<<endl;
}
mystring::~mystring()
{delete []str;str=NULL ;cout<<"析构函数"<<endl;
}
void mystring::show(){//如需重载<<,则请参见9.3.3节,暂时未学到,替代方法是用show()函数cout<<str<<endl;
}
char & mystring::operator[](int i)
{   //返回引用,可读可写//if(i>last){cout<<"access violate!";exit(1);}return str[i];
}
mystring &mystring::operator=(const mystring & st){if(&st==this)return*this;last=st.last;//新的长度delete []str;str=new char[last+1];last=0;do{str[last]=st.str[last];last++;}while(st.str[last]!='\0'&& last<maxsize-1);str[last] ='\0'; //截尾处理时,必须加串结束符return *this;//拷贝的临时变量生命期在调用它的表达式中
}
mystring & mystring::operator=(char* s)
{ //这里返回值为引用,不调用拷贝构造函数//delete []str;//这里不能这样??为什么?last=0;str=new char[strlen(s)+1];//s的长度没有包括\0 do{str[last]=s[last];last++;}while(s[last]!='\0'&&last<maxsize-1);str[last] ='\0'; //截尾处理时,必须加串结束符return *this;
}
mystring mystring::operator+(mystring & st){//注意+和+=的不同mystring temp(*this);temp.last=temp.last+st.last;//新的长度delete []temp.str;temp.str=new char[temp.last+1];//申请空间   s的长度没有包括\0temp.last =0;do{temp.str[temp.last]=str[temp.last];temp.last++;}while(str[temp.last]!='\0'&& temp.last<temp.maxsize-1);if(temp.last<temp.maxsize-1){int i=0;do{temp.str[temp.last]=st.str[i];temp.last++;i++;}while(st.str[i]!='\0'&& temp.last<temp.maxsize-1);}temp.str[temp.last] ='\0'; //截尾处理时,必须加串结束符return temp;//拷贝的临时变量生命期在调用它的表达式中
}
mystring mystring::operator+=(mystring & st){//+=在对象自身进行mystring temp(*this);int i;//保存原来的长度last=last+st.last;//新的长度delete []str;str=new char[last+1];//申请空间   s的长度没有包括\0last=0;do{str[last]=temp.str[last];last++;}while(temp.str[last]!='\0'&& last<maxsize-1); if(last<maxsize-1){i=0;do{str[last]=st.str[i];i++;last++;}while(st.str[i]!='\0'&& last<maxsize-1);   }str[last] ='\0'; //截尾处理时,必须加串结束符*/return *this;//拷贝的临时变量生命期在调用它的表达式中
}
bool mystring::operator<(mystring & st){   //重载<运算符int i=0,k;do{k=str[i]-st.str[i];i++;}while(k==0&&i<last&&i<st.last);if(k<0) return true;if(i==last&&i!=st.last) return true;return false;
}
bool mystring::operator==(mystring & st){int i=0,k;if(last!=st.last) return false;do{k=str[i]-st.str[i];i++;}while(k==0&&i<last);if(k!=0) return false;else return true;
}
int main(){int i=0;char *sp1="sp1",*sp2="sp2",*sp3="sp3",*sp4="sp4";mystring mstr1(sp1);mystring mstr2(sp2);mystring mstr3(sp3);mystring mstr4(mstr3);mystring mstr5=mstr3;mystring mstr6; mstr6=sp4; //ms6赋值是返回引用,不用拷贝构造函数/*cout<<"mstr1:   ";mstr1.show();cout<<"mstr2:   ";mstr2.show();cout<<"mstr3:   ";mstr3.show();cout<<"mstr4:   ";mstr4.show();cout<<"mstr5:   ";mstr5.show();cout<<"ms6:   ";mstr6.show();mstr6=mstr5;cout<<"mstr6=mstr5:  ";mstr6.show ();mstr6=mstr1+mstr2;cout<<"mstr6=mstr1+mstr2:  ";mstr6.show ();mstr3+=mstr4;cout<<"mstr3+=mstr4:  ";mstr3.show ();mstr4=mstr1+mstr2+mstr6;//注意temp和临时变量由拷贝构造函数生成cout<<"mstr4=mstr1+mstr2+mstr6:    ";mstr4.show();mstr1+=mstr2+mstr3;cout<<"mstr1+=mstr2+=mstr3:   ";mstr1.show();if(mstr1<mstr4) {mstr1.show();cout<<"应排在"<<endl;mstr4.show();cout<<"之前"<<endl;}else {mstr1.show();cout<<"应排在"<<endl;mstr4.show();cout<<"之后"<<endl;}mstr6=mstr1;//mstr6赋值不是返回引用,必须调用拷贝构造函数建立临时对象if(mstr1==mstr6) cout<<"串mstr1与串mstr6相同"<<endl;else cout<<"不相同!"<<endl;mstr1="C++ programming language";*/i=0;while(mstr1[i]!='\0') cout<<mstr1[i++];//读出cout<<endl;mstr1[i++]='.';//写入mstr1.show ();i--;mstr1[i]='\0';mstr1.show();mstr1[i]='k';mstr1.show();return 0;
}

C++ 实现mystring类型相关推荐

  1. Go 知识点(05)— 类型别名与类型定义

    1. 类型别名 类型别名需要在别名和原类型之间加上赋值符号 = ,使用类型别名定义的类型与原类型等价,Go 语言内建的基本类型中就存在两个别名类型. byte 是 uint8 的别名类型: rune ...

  2. golang 切片 接口_Go 经典入门系列 18:接口(一)

    点击上方蓝色"Go语言中文网"关注,每天一起学 Go 欢迎来到 Golang 系列教程[1]的第 18 个教程.接口共有两个教程,这是我们接口的第一个教程. 什么是接口? 在面向对 ...

  3. golang 1.18 新增泛型 简介

    目录 (一)如何对泛型进行输出 (二)如何用泛型约束使用的类型范围 (三)泛型中的接口本身对范型进行约束 (四)泛型中如何操作切片 (五)如何利用泛型实现最大值最小值函数 (六)如何使用Golang泛 ...

  4. Golang教程:常量

    定义常量 常量(constant)表示固定的值,比如:5,-89,"I love Go",67.89 等等. 考虑如下程序: var a int = 50 var b string ...

  5. Ajax.Net之数据类型

    这个例子是按照Ajax.Net的作者的Data Type示例做的,大概意思是能够把好多的数据类型做为参数传递给服务器端的Ajax.Net方法,也能够从Ajax.Net服务器端方法返回同样的数据类型.特 ...

  6. Go:测试库(GoConvey,testify,GoStub,GoMonkey)对比及简介

    文章目录 一.测试框架 stretchr/testify 1.stretchr/testify/assert 2.stretchr/testify/require 二.测试框架GoConvey 1. ...

  7. C++ 封装一个简单的String

    大体都完成了,剩余对类的 () 重载  仿函数 的实现有bug.其余正常运行. ()调用符号的重载实现实现 类似 MyString()("hello world") 将char*的 ...

  8. 【侯捷】C++STL标准库与泛型编程(第四讲)

    第四讲 1.一个万用的Hash Function 说明: 1.1 针对自定义类型的哈希函数的编写方式 自定义类型: #include <functional> class Customer ...

  9. Object Pascal语言

    Object Pascal语言 控制串由一个或多个控制字符组成,由"#"开头,后面紧跟一个范围在0-255的无符号的整数,用于代表相应的ASCII字符. 下面再列出一些变量声明的例 ...

最新文章

  1. Linux命令grep
  2. 【资料】wpcap.dll/Packet.dll库中相应函数
  3. 大理,风花雪月俏丽金花
  4. CentOS 6 php5.6.0一键部署脚本
  5. 若一个月给你50000元,要你选下面一件事做,你会选?
  6. 某大型企业私有云建设思路解析
  7. mysql的安装备份恢复_安装使用Percona XtraBackup来备份恢复MySQL的教程
  8. 【转】注册Azure AD 应用程序
  9. apache配置多个站点
  10. php的验证码要gd库,PHP通过GD库实现验证码功能
  11. 最简单的delphi启动画面(转)
  12. Struts2学习笔记 - Action篇定义逻辑Action
  13. 工作流图形设计器参考资料
  14. vc6 移植到vs2013
  15. 对抗训练fgm、fgsm和pgd原理和源码分析
  16. GitHub 的 Pull Request 是指什么意思?
  17. 微信对话框删除后怎么找回聊天记录?
  18. 利用压缩文件修改加密word文档
  19. 背包问题不同要求下的初始化
  20. 通达信操作箱体,箱顶和箱底线指标公式源码 红色持股绿色持币

热门文章

  1. 12月10日周日下午广州Linuxer聚会(4大演讲主题+蜗窝大侠郭健主持)
  2. 曙光服务器显示器接入只显示logo,显示屏只显示显示屏品牌logo,没有其他反应
  3. COBOL中的基本语法(转)
  4. ROCKET 数据可视化可以如此简单
  5. 塞拉利昂一公司计划投资10亿美元用于建设光伏农业项目
  6. BP神经网络求解异或算法
  7. HDU6143 Killer Names(数论)
  8. 【JavaSE】十二生肖带你走进枚举类
  9. Microsoft AjaxToolkits之15. RoundedCorners控件
  10. 使用思维导图进行产品需求分析