最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
String类的写时拷贝实例
时间:2017-02-04 编辑:简简单单 来源:一聚教程网
实例如下:
代码如下 | 复制代码 |
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() { String s1("hello"); String s2(s1); String s3; 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; } |
-
下一个: C# 使用反射来实现对象的深度复制方法
相关文章
- C#复制数组的两种方式及效率比较解读 10-24
- ASP.NET Identity用法解析 10-24
- ASP.NET MVC使用Identity增删改查用户介绍 10-24
- C语言中atoi函数模拟实现介绍 10-18
- .Net反向代理组件Yarp用法介绍 10-10
- .NET使用YARP通过编码方式配置域名转发实现反向代理教程 10-10