新聞中心
String的實現(xiàn)需要注意的是String的拷貝構(gòu)造。它的拷貝構(gòu)造有深拷貝和淺拷貝之分。
我們先來用淺拷貝實現(xiàn)String
class String { public: String() { str = new char('A'); } String(char *s) { str = new char[strlen(s) + 1]; if (str != NULL) { strcpy(str, s); } } String(const String& s) { str=s.str; } String& operator=(const String& s) { if (this != &s) { str=s.str; } return *this; } private: char *str; }; void test() { String s1("hello world"); String s2(s1); }
當(dāng)s1,s2出自的作用域時,會自動調(diào)用析構(gòu)函數(shù),此時s1,s2指向同一片內(nèi)存。所以這塊內(nèi)存會被釋放兩次,程序會崩潰。
所以在這里我們要采用深拷貝的方式
構(gòu)造函數(shù)和賦值運(yùn)算符重載
String(const String& s) { str = new char[strlen(s.str) + 1]; //new出來一塊新的空間 if (str) { strcpy(str, s.str); } } String& operator=(const String& s) { if (this != &s) { if (str != NULL) { delete[] str; str = new char[strlen(s.str) + 1]; strcpy(str, s.str); } } return *this; }
還有一種方法可以解決這個一塊空間會被多次釋放的問題,那就是寫時拷貝
在第一次構(gòu)造一個對象的時候,多開辟四個字節(jié)當(dāng)做計數(shù)器,用來記錄有幾個指針指向這塊空間。每當(dāng)用這塊空間拷貝構(gòu)造一個新對象或者把這塊空間賦給另外一個對象時,計數(shù)器相應(yīng)增加。那么當(dāng)調(diào)用析構(gòu)函數(shù)時,每次計數(shù)器減一,當(dāng)計數(shù)器減到一時,說明只有一個指針指向這塊空間,此時再把這塊空間delete,就不會出現(xiàn)一塊空間多次釋放的問題了。
class String { public: String(char *str="") :_str(new char[strlen(str)+1+4]) { *((int *)_str) = 1; //將開辟的空間前4個字節(jié)強(qiáng)制轉(zhuǎn)換成整型并賦為1 _str = _str + 4; //將_str重新定為真正字符串開始的地方,這樣比較方便 strcpy(_str, str); //不用每次向后找 } String(const String& str) { _str = str._str; (*((int *)(_str - 4)))++; } ~String() { if (*_str != NULL) { if (((*((int *)(_str - 4)))--) == 0) //判斷計數(shù)器是否減到0 { delete[] (_str-4); } } } public: String& operator=(const String& str) { if (this != &str) { if (((*((int *)(_str - 4)))--) == 0) { delete[] (_str-4); } _str = str._str; (*(int *)(str._str - 4))++; return *this; } } char& operator[](int index) { char *tmp = _str; if (((*(int *)(_str - 4))-1) != 0) { (*(int *)(_str - 4))--; _str = new char[strlen(_str) + 5]; (*(int *)(_str + 4)) = 1; _str = _str - 4; strcpy(_str, tmp); } return _str[index]; } private: char *_str; };
但是這樣做也有一個壞處。就是指向同一塊空間的指針,只要改一個指針指向的內(nèi)容,等于其他的指針指向的內(nèi)容也跟著改變了。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享名稱:C++String的實現(xiàn)-創(chuàng)新互聯(lián)
本文地址:http://www.dlmjj.cn/article/dijddi.html