1. 程式人生 > >一個模擬寫實拷貝技術的例子------引用計數

一個模擬寫實拷貝技術的例子------引用計數

#include<iostream>
using namespace std;
#include<string>
class myString {
public:
	myString() {
		cout << "預設建構函式" << endl;
		_str = new char[5];		//以頭部的4個位元組來描述引用次數
		_str[4] = 0;
		getCount() = 1;
	}
	myString(const char* str) {
		cout << "帶參建構函式" << endl;
		_str = new char[strlen(str) + 1 + 4];
		strncpy_s(_str + 4, strlen(str) + 1, str, strlen(str));
		getCount() = 1;
	}
	myString(const myString &src) {
		cout << "拷貝建構函式" << endl;
		_str = src._str;
		getCount()++;	//僅僅是引用次數加1
	}
	myString& operator = (const myString &src) {
		cout << "賦值運算子過載" << endl;
		if (this == &src) {		//防止自賦值
			return *this;
		}
		if (0 == --getCount()) {	//進行等號賦值時,自身引用計數執行完成是需要減去1的
			delete[]_str;
		}
		_str = src._str;
		getCount()++;
		return *this;
	}
	~myString() {
		cout << "解構函式" << endl;
		if (0 == --getCount()) {
			delete[]_str;
		}
	}
	char& operator[](int pos) {		//該函式有改值的嫌疑
		cout << "取值函式" << endl;
		if (getCount() > 1) {	//至少被引用兩次
			getCount()--;
			char *tmp = _str + 4;
			_str = new char[strlen(tmp) + 1 + 4];
			strncpy_s(_str + 4, strlen(tmp) + 1, tmp, strlen(tmp));
			getCount() = 1;
		}
		return _str[pos + 4];
	}
private:
	int &getCount() { return *(int *)_str; }	//精華:引用計數
	char *_str;
	friend ostream& operator<<(ostream& out, const myString&str);
};

ostream& operator<<(ostream& out, const myString&str) {
	out << str._str + 4 << endl;
	return out;
}


int main()
{
	myString s1;
	myString s2("hello");
	s1 = s2;
	cout << s1;
	myString s3(s2);
	cout << "s2  ";
	cout << s2 << endl;
	cout << "s3  ";
	cout << s3 << endl;
	s3[0] = 'a';
	cout << "s3  ";
	cout << s3 << endl;
	system("pause");
	return 0;
}
圖1  VS2017下執行結果