您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: