版权声明:本文为博主原创文章,未经博主允许不得转载。
- #include <iostream>
- #include <stdio.h>
- using namespace std;
- class String {
- public:
- String(const char *pdata);
- String(const String &rhs);
- String &operator = (const String &rhs);
- ~String();
- private:
- class StringValue {
- public:
- int refCount;
- char *data;
- StringValue(const char *pdata);
- ~StringValue();
- };
- StringValue *value;//所有的引用对象均共享唯一一个value,value里面实际存储data和引用次数
- };
- String::StringValue::StringValue(const char *pdata):refCount(1) {
- data = new char[strlen(pdata) + 1];
- strcpy(data,pdata);
- }
- String::StringValue::~StringValue() {
- delete [] data;
- }
- String::String(const char *pdata):value(new StringValue(pdata))
- {}
- String::String(const String &rhs) {//要对引用加1
- value = rhs.value;
- value->refCount++;//所有指向同一段data的对象的引用加1
- }
- String &String::operator =(const String &rhs) {
- if (value == rhs.value)//注意,不是this == &rhs
- return *this;
- if(--value->refCount == 0)
- delete value;
- value = rhs.value;
- ++value->refCount;
- return *this;
- }
- String::~String() {
- if (--value->refCount == 0)
- delete value;
- }
- void test() {
- String ss("ssss");
- String s1 = ss;
- String s2("dddd");
- s2 = ss;
- }
- int main() {
- test();
- }
原文地址:http://blog.csdn.net/sunmenggmail/article/details/8172172