一個模擬寫實拷貝技術的例子------引用計數
阿新 • • 發佈:2018-12-12
#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; }