String类的写时拷贝实例
实例如下:
#include<iostream>
usingnamespacestd;
classString;
ostream&operator<<(ostream&out,constString&s);
//引用计数器类
classString_rep
{
friendclassString;
friendostream&operator<<(ostream&out,constString&s);
public:
String_rep(constchar*str)
:use_count(0)
{
if(str==NULL)
{
data=newchar[1];
data[0]='\0';
}
else
{
data=newchar[strlen(str)+1];
strcpy(data,str);
}
}
String_rep(constString_rep&rep):use_count(0)
{
data=newchar[strlen(rep.data)+1];
strcpy(data,rep.data);
}
String_rep&operator=(constString_rep&rep)
{
if(this!=&rep)
{
delete[]data;
data=newchar[strlen(rep.data)+1];
strcpy(data,rep.data);
}
return*this;
}
~String_rep()
{
delete[]data;
data=NULL;
}
public:
voidincrease()
{
++use_count;
}
voiddecrease()
{
if(use_count==0)
{
deletethis;//自杀行为释放this所指的空间,在释放之前调动这个类的析构函数
}
}
private:
char*data;
intuse_count;
};
////////////////////////////////////////////////////////////////////////////////////////
classString
{
friendostream&operator<<(ostream&out,constString&s);
public:
String(constchar*str="")
{
rep=newString_rep(str);
rep->increase();
}
String(constString&s)
{
rep=s.rep;//浅拷贝
rep->increase();
}
String&operator=(constString&s)
{
if(this!=&s)
{
rep->decrease();//模拟delete
rep=s.rep;//模拟new
rep->increase();//模拟strcpy
/*rep=s.rep;//这会更改引用计数器指针,造成s内存泄漏
rep->increase();*/
}
return*this;
}
~String()
{
rep->decrease();
}
public:
voidto_upper()
{
if(rep->use_count>1)
{
String_rep*new_rep=newString_rep(rep->data);
rep->decrease();
rep=new_rep;
rep->increase();
}
char*ch=rep->data;
while(*ch!='\0')
{
*ch-=32;
++ch;
}
}
private:
String_rep*rep;//引用计数器
};
ostream&operator<<(ostream&out,constString&s)
{
out<<s.rep->data;
returnout;
}
voidmain()
{
Strings1("hello");
Strings2(s1);
Strings3;
s3=s2;
cout<<"s1="<<s1<<endl;
cout<<"s2="<<s2<<endl;
cout<<"s3="<<s3<<endl;
s2.to_upper();
cout<<"-----------------------------------------------"<<endl;
cout<<"s1="<<s1<<endl;
cout<<"s2="<<s2<<endl;
cout<<"s3="<<s3<<endl;
}
以上这篇String类的写时拷贝实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。