实例如下:
| 代码如下 | 复制代码 |
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] =' ' } 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 !=' ') { *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; } | |