关于拷贝函数建立的处理字符串的函数,比较实用,贴上来供大家学习:
#include<iostream>
using namespace std;
class myString2{
char *str;
int len;
public:
myString2(char *s);
myString2(myString2& str);
~myString2();
void strOut();
void strCat(myString2 str2);
int strCmp(myString2 str2);
};
myString2::myString2(char *s){
char *tmp=s;
while(*tmp++);
int sLen=tmp-s;
str=new char[sLen+1];
int i=0;
while(s[i]){
str[i]=s[i];
i++;
}
str[i]='\0';
len=i;
}
myString2::myString2(myString2&s){ //拷贝构造函数
int sLen=s.len;
str= new char[sLen+1];
int i=0;
while(s.str[i]){
str[i]=s.str[i];
i++;
}
str[i]='\0';
len=i;
}
myString2::~myString2(){
if(str!=NULL)
delete []str;
}
void myString2::strOut(){
if(str!=NULL)
cout<<"str="<<str<<endl;
else
cout<<"empty!"<<endl;
}
void myString2::strCat(myString2 str2){ //将str2连接到str后,先申请一个新空间储存
int newLen; //str新长度
char *tmp,*head;
newLen=len+str2.len;
tmp=new char[newLen+1]; //动态申请恰好的空间放字符串
head=tmp;
int j=0;
if(str!=NULL){ //调用者对象str串不为空,放入新申请的空间中。释放调用者对象的原str串空间。
while(str[j])
*tmp++=str[j++];
delete str;
}
j=0;
while(str2.str[j])
*tmp++=str2.str[j++];
*tmp='\0';
len=newLen;
str=head;
}
int myString2::strCmp(myString2 str2){ //两字符串相比较
int i=0;
while(str[i]!='\0'&&str2.str[i]!='\0'){
if(str[i]>str2.str[i])
return 1;
if(str[i]<str2.str[i])
return -1;
i++;
}
if(str[i]=='\0'&&str2.str[i]=='\0')
return 0; //字符完全相同
if(str[i]!='\0')
return 1; //str串大(str串未结束)
else
return -1;
}
void main()
{
myString2 obj1("12345"); //通过类对象对成员函数进行调用
myString2 obj2("abcdefg");
myString2 obj3("333");
myString2 obj4=obj2; //必须情况之一,调用拷贝构造函数
cout<<"obj1: ";obj1.strOut();
cout<<"obj2: ";obj2.strOut();
cout<<"obj3: ";obj3.strOut();
cout<<"obj4: ";obj4.strOut();
obj1.strCat(obj2);//实参为类对象,调用拷贝构造函数
cout<<"obj1=>"; obj1.strOut();
obj2.strCat(obj3);
cout<<"obj2=>"; obj2.strOut();
int i=obj1.strCmp(obj1);
cout<<"i="<<i;
i=obj1.strCmp(obj3);cout<<" i="<<i;
i=obj3.strCmp(obj1);cout<< " i="<<i<<endl;
}
结果: