在c語言中/c++中,字串是乙個應用很廣泛的型別,也是很基礎的型別,c語言並沒有直接處理字串的操作而是採用字元指標和字串陣列進行操作,而在c++中標準庫為我們封裝了乙個字串的類供我們使用,使用需要#inlcude 標頭檔案。我們也可以自己模擬實現乙個簡單的string類。
在模擬實現string類的過程中,不可避免的會遇到深拷貝淺拷貝的問題,下面就深拷貝淺拷貝做乙個簡介。所謂深拷貝淺拷貝,簡單來說就是淺拷貝只是簡單的將值拷貝過來,用乙個物件初始化另乙個物件,只複製了成員,並沒有複製資源,使兩個物件同時指向了同一資源的
。而深拷貝則是將資源和值一塊拷貝過來,此時兩個物件各自占用資源,儘管值相同,但是互不影響。
下面通過**進行對比:
//淺拷貝
class string
else
} string(const string& s)
string& operator=(const string& s)
return *this;
} ~string() }
private:
char* _pstr;
};
//深拷貝
由圖可以看出,淺拷貝使得多個物件指向一塊空間,然而當最後析構的時候,比如c先釋放空間,而a,b卻不知道還要釋放空間便會產生重複釋放同一
記憶體的錯誤。為此,我們可以對淺拷貝進行乙個優化,例如在私有成員中加入乙個int* pcount來標記一塊空間被幾個物件占用,當只有乙個物件占用如果進行析構便可釋放空間,否則只對*pcount--。
//淺拷貝優化--帶有計數版本的string類,用指標指向計數的空間
class string
else
} string(const string& s)
string& operator=(const string& s)
_pstr = s._pstr;
_pcount = s._pcount;
(*_pcount)++;
} return *this;
} ~string()
_pcount = null;
_pstr = null;
}private:
char* _pstr;
int* _pcount;
};
最後再給出一種深拷貝的簡潔版本,通過呼叫swap來簡化操作,**如下:
//深拷貝的簡潔寫法
class string
else
} string(string& s) :_pstr(null)//必須對_pstr初始化,防止釋放隨機值的空間
string& operator=(string& s)
return *this;
} ~string() }
private:
char* _pstr;
};
模擬實現string類 c
include include using namespace std class string string const string m 拷貝建構函式 string 析構函式 string operator string m1 賦值運算子過載 s new char strlen m1.s 1 s...
模擬實現String類(C )
以下就是string類的模擬實現 測試環境為vs2013 define crt secure no warnings 1 include include include using namespace std class string 拷貝建構函式 string const string s str...
模擬實現string類
include using namespace std include class string string string a 2 為什麼要用 優點在哪 string void print string operator const string a string operator const s...