c++自定义string类
2015-08-08 11:04
281 查看
,测试是正确的,请放心使用
head.h
#ifndef HEAD_H //避免重定义错误, 该文件编译一次 #define HEAD_H #include<iostream> #include<cstring>//C Style using namespace std; class mystring{ private: char* str; int maxsize; int last; public: mystring(); mystring(const char *s); ~mystring(); mystring(const mystring &); void show(); char & operator[](int i); mystring & operator=(const mystring &); mystring & operator=(const char *);//这里重载的=是把C风格字符串赋给mystring mystring operator+(const mystring &); mystring operator+=(const mystring &); bool operator<(const mystring &); bool operator==(const mystring &); }; #endif
new.cpp
#include<iostream> #include<cstring>//C style #include"head.h" using namespace std; mystring::mystring():maxsize(0),last(0){ cout<<"The default constructor"<<endl; str=new char [1]; *str='\0'; } mystring::mystring(const char *s){ cout<<"The constructor with parameters"<<endl; if (s==NULL){ maxsize=0; last=0; str=new char[1]; *str='\0'; } else{ maxsize=strlen(s); last=strlen(s); str=new char[maxsize+1]; strcpy(str,s); } } mystring::~mystring(){ if(str) delete []str; maxsize=0; last=0; str = NULL; } mystring::mystring(const mystring & s){ cout<<"The Copy constructor"<<endl; if(s.str){ str=new char[strlen(s.str)+1]; strcpy(str,s.str); } else str=NULL; } void mystring::show(){ cout<<str<<endl; } char & mystring::operator[](int i){ if(i<0||i>last) cout<<"The subscript out"<<endl; return str[i]; }//下标运算符,返回引用,可读可写 mystring & mystring::operator=(const mystring & s){ cout<<"The Assignment constructor"<<endl; delete []str; if(s.str){ str=new char[strlen(s.str)+1]; strcpy(str,s.str); maxsize=strlen(s.str); last=maxsize; } else str=NULL; return *this; }//重载赋值构造函数 //这里重载的=是把C风格字符串赋给mystring mystring & mystring::operator=(const char *s){ delete []str; if(s){ str=new char[strlen(s)+1]; strcpy(str,s); maxsize=strlen(s); last=maxsize; } else str=NULL; return *this; } mystring mystring::operator+(const mystring &s){ mystring temp; maxsize=strlen(str)+strlen(s.str); temp.str=new char[maxsize+1]; strcpy(temp.str,str); strcat(temp.str,s.str); last=maxsize; return temp; } mystring mystring::operator+=(const mystring &s){ char *temp; maxsize=strlen(str)+strlen(s.str); temp=new char[maxsize+1]; strcpy(temp,str); strcat(temp,s.str); delete [] str; str=temp; last=maxsize; //delete[] temp; return *this; } bool mystring::operator<(const mystring &s){ if(strcmp(str,s.str)<0) return true; else return false; } bool mystring::operator==(const mystring &s){ if(strcmp(str,s.str)==0) return true; else return false; }
main.cpp
#include<iostream> #include<cstring>//C #include"head.h" using namespace std; //主程序测试功能 int main(){ char *ch1="jisuanjixueyuan",*ch2="C++The-second-edition",*ch3="Logic-design",*ch4="C++Primer-The-Chinese-version"; mystring str1;//测试默认的构造函数 mystring str2(ch1);//测试带参数的构造函数 mystring str3(str2);//测试赋值构造函数 str1.show(); str2.show();//测试show() str3.show(); mystring str4(ch2),str5,str6,str7(ch3),str8(ch4); str5=str4;//测试mystring到mystring str6=ch3;//测试char到mystring str5.show(); str6.show(); //测试+ str1=str7+str8; str1.show(); //测试+= str2+=str4; str2.show(); //测试< if(str1<str2){ str2.show();cout<<"应排在"<<endl;str1.show();cout<<"之前"<<endl; } else{ str1.show();cout<<"应排在"<<endl;str2.show();cout<<"之后"<<endl; } //测试== str6=str1; str1.show(); if(str6==str1) cout<<"串str1与串str6相同"<<endl; //测试[],输出, for(int i=0;str5[i]!='\0';i++) cout<<str5[i]; cout<<endl; cout<<str4[2]<<endl; //写入 int i; for(i=0;str4[i]!='\0';i++) str4[i]='b'; str4.show(); return 0; }
相关文章推荐
- 牛客网(搜狗2015 C++工程师笔试题)
- [C++11 并发编程] 04 - 动态选择并发线程的数量
- C++连接mysql数据库的两种方法
- 【C++基础之一】C++ 虚函数表解析
- C/C++(链表应用)笔记——使用链表进行多项式的合并
- C++ 虚函数实现多态浅析
- C++面向对象--类
- C++中如何控制输出的格式
- 【C++智能指针 auto_ptr】
- C++总结
- C语言指针转换为intptr_t类型
- 谈谈new 与delete
- C++类对象创建过程揭密
- C++浅析——虚表和虚表Hook
- C++浅析——虚表和虚表Hook
- 排序算法 C++代码实现
- 转:C++学习之Pair
- C语言中为什么要使用enum
- [leetcode] 040. Combination Sum II (Medium) (C++)
- [LeetCode] 039. Combination Sum (Medium) (C++)