關於String類的寫實拷貝

2021-08-03 14:41:24 字數 1526 閱讀 1647

在自己定義的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 中,在用乙個物件初始化另乙個物件時,只複製了成員,並沒有複製資源,使兩個物件同時指向了同一資源的複製方...