在自己定義的string類中使用寫實拷貝來提高效率。
寫實拷貝是在淺拷貝的基礎上使用引用計數器來拷貝物件,如果有物件被拷貝構造時只需要將計數器++,不用再開闢新的空間。
可以編寫初版的**:
#define _crt_secure_no_warnings 1
#include
using
namespace
std;
class string
~string()
}//寫實拷貝
string(string& s)
:_str(s._str)
private:
char* _str;
int _refcount;
};
這段**看似正確,但是其實有很大的bug,因為計數器是私有的,所以每個物件的計數器都為1,釋放空間時系統會奔潰。
所以可以將_refcount設定為static靜態,為物件共有。**如下:
#define _crt_secure_no_warnings 1
#include
using
namespace
std;
class string
~string()
}//寫實拷貝
string(string& s)
:_str(s._str)
private:
char* _str;
static
int _refcount;//static靜態成員可以被共用
};int string::_refcount = 0; //靜態變數要在類中宣告,類外定義
但是static是全域性變數,所以建立不同物件時_refcount會出現問題。
所以可以直接再開闢乙個空間用來儲存計數器個數 ,使用乙個指標指向這塊空間,這樣拷貝構造時只需要將物件指標指向計數器,將計數器內容++,釋放物件空間時,如果計數器個數不為1,則直接計數器內容–,為1證明只有乙個物件指向這塊空間,則釋放計數器空間,釋放字串空間。
**如下:
#define _crt_secure_no_warnings 1
#include
using
namespace
std;
class string
~string()
}string(string& s)
:_str(s._str)
, _refptr(s._refptr)
string& operator=(string& s)
_str = s._str;
_refptr = s._refptr;
(*_refptr)++;
}return *this;
}private:
char* _str;
int* _refptr;
};
這樣就是乙個完整的正確的寫實拷貝了。 關於string類的深淺拷貝問題
首先,先看一下下面的 會出現什麼問題?class string else string string const string s data s.data private char data void test 上面的程式會奔潰,讓我們來分析原因 這就是所謂的淺拷貝,也稱位拷貝,編譯器只是直接將指標...
String類,淺拷貝,深拷貝
想要使用c 中的類那麼必須要有它的標頭檔案,include 首先來看下面乙個 這個程式很簡單,但是如果有乙個空指標呢?那麼就需要判斷了,並且用預設值把有引數的string和沒有引數的string合併在一起,那這個程式只需要做下面的改變 既然你的建構函式開闢了一段空間,那麼就需要釋放掉,此時就需要析構...
string類的深淺拷貝問題
字串是我們在編寫程式的時候經常用的到的。c 庫已經幫我們實現了乙個功能更加強大的字串類string,我們要去了解它是怎麼實現的。只要是涉及到 string類的地方多少都會涉及到深淺拷貝的問題。在c 中,在用乙個物件初始化另乙個物件時,只複製了成員,並沒有複製資源,使兩個物件同時指向了同一資源的複製方...