亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++中String類模擬實現以及深拷貝淺拷貝

2020-05-23 13:35:58
字體:
來源:轉載
供稿:網友

詳解C++中String類模擬實現以及深拷貝淺拷貝

在C語言中/C++中,字符串是一個應用很廣泛的類型,也是很基礎的類型,C語言并沒有直接處理字符串的操作而是采用字符指針和字符串數組進行操作,而在C++中標準庫為我們封裝了一個字符串的類供我們使用,使用需要#inlcude <string>頭文件。我們也可以自己模擬實現一個簡單的String類。

在模擬實現String類的過程中,不可避免的會遇到深拷貝淺拷貝的問題,下面就深拷貝淺拷貝做一個簡介。所謂深拷貝淺拷貝,簡單來說就是淺拷貝只是簡單的將值拷貝過來,用一個對象初始化另一個對象,只復制了成員,并沒有復制資源,使兩個對象同時指向了同一資源的。而深拷貝則是將資源和值一塊拷貝過來,此時兩個對象各自占用資源,盡管值相同,但是互不影響。

下面通過代碼進行對比:

//淺拷貝 class String { public:   String(const char* s = "")   {     if (NULL == s) {       _pStr = new char[1];       *_pStr = '/0';     }     else {       _pStr = new char[strlen(s) + 1];       strcpy(_pStr, s);     }   }   String(const String& s)   {     _pStr = s._pStr;   }   String& operator=(const String& s)   {     if (this != &s) {       _pStr = s._pStr;     }     return *this;   }   ~String()   {     if (NULL != _pStr) {       delete[] _pStr;       _pStr = NULL;     }   }  private:   char* _pStr; }; 
//深拷貝 class String { public:   String(const char* s = "")   {     if (NULL == s) {       _pStr = new char[1];       *_pStr = '/0';     }     else {       _pStr = new char[strlen(s) + 1];       strcpy(_pStr, s);     }   }   String(const String& s) : _pStr(new char[strlen(s._pStr) + 1])   {     strcpy(_pStr, s._pStr);   }   String& operator=(const String& s)   {     if (this != &s) { //先申請空間將s的內容拷貝到一個臨時變量再去釋放原有的空間       char* temp = new char[strlen(s._pStr) + 1];//防止申請空間失敗連原有的空間都沒了       strcpy(temp, s._pStr);       delete[] _pStr;       _pStr = NULL;       _pStr = temp;     }     return *this;   }   ~String()   {     if (NULL != _pStr) {       delete[] _pStr;       _pStr = NULL;     }   } private:   char* _pStr; }; 

C++,String類,模擬實現,深拷貝,淺拷貝

C++,String類,模擬實現,深拷貝,淺拷貝

由圖可以看出,淺拷貝使得多個對象指向一塊空間,然而當最后析構的時候,比如c先釋放空間,而a,b卻不知道還要釋放空間便會產生重復釋放同一內存的錯誤。為此,我們可以對淺拷貝進行一個優化,例如在私有成員中加入一個int*
 pCount來標記一塊空間被幾個對象占用,當只有一個對象占用如果進行析構便可釋放空間,否則只對*pCount--。

//淺拷貝優化--帶有計數版本的String類,用指針指向計數的空間 class String { public:   String(const char* s = "") : _pCount(new int(1))   {     if (NULL == s) {       _pStr = new char[1];       *_pStr = '/0';     }     else {       _pStr = new char[strlen(s) + 1];       strcpy(_pStr, s);     }   }   String(const String& s)   {     _pStr = s._pStr;     _pCount = s._pCount;     (*_pCount)++;   }   String& operator=(const String& s)   {     if (this != &s) {       if (--(*_pCount) == 0) {         delete[] _pStr;         delete _pCount;       }       _pStr = s._pStr;       _pCount = s._pCount;       (*_pCount)++;     }     return *this;   }   ~String()   {     if (NULL != _pStr && --(*_pCount) == 0) {       delete[] _pStr;       delete _pCount;     }     _pCount = NULL;     _pStr = NULL;   }  private:   char* _pStr;   int* _pCount; }; 

最后再給出一種深拷貝的簡潔版本,通過調用swap來簡化操作,代碼如下:

//深拷貝的簡潔寫法 class String { public:   String(const char* s = "")   {     if (NULL == s) {       _pStr = new char[1];       *_pStr = '/0';     }     else {       _pStr = new char[strlen(s) + 1];       strcpy(_pStr, s);     }   }   String(String& s) :_pStr(NULL)//必須對_pStr初始化,防止釋放隨機值的空間   {     String temp(s._pStr);     swap(_pStr, temp._pStr);   }   String& operator=(String& s)   {     if (this != &s) {        swap(_pStr, s._pStr);     }     return *this;   }   ~String()   {     if (NULL != _pStr) {       delete[] _pStr;       _pStr = NULL;     }   } private:   char* _pStr; }; 

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人人爽久久涩噜噜噜网站| 欧美在线观看网址综合| 中文字幕日韩av| 国产精品美女免费视频| 欧美日韩在线观看视频小说| 日韩在线不卡视频| 最新69国产成人精品视频免费| 日本亚洲精品在线观看| 欧美大片在线免费观看| 久久成人免费视频| 亚洲最大的av网站| 91精品国产自产在线| 欧美高跟鞋交xxxxxhd| 国内精品一区二区三区四区| 国产99在线|中文| 91av福利视频| 成人综合网网址| 亚洲男人第一网站| 国产一区二区在线免费| 精品少妇v888av| 欧美精品www| 欧洲成人在线视频| 69久久夜色精品国产69乱青草| 亚洲视频网站在线观看| 国产福利精品在线| 欧美在线免费视频| 亚洲精品av在线| 日韩中文在线中文网三级| 日韩av日韩在线观看| 午夜精品一区二区三区在线视频| 成人疯狂猛交xxx| 日韩精品一二三四区| 97**国产露脸精品国产| 欧美精品一区二区免费| 国产精品亚洲片夜色在线| 亚洲曰本av电影| 成人免费xxxxx在线观看| 亚洲人成毛片在线播放| 色偷偷av一区二区三区| 欧美日韩国内自拍| 国产日韩精品在线播放| 国产精品免费久久久久影院| 国内精品小视频在线观看| 最近2019年好看中文字幕视频| 日本久久久a级免费| 8050国产精品久久久久久| 亚洲r级在线观看| 中文字幕国产精品久久| 国产性猛交xxxx免费看久久| 国产中文字幕日韩| 国产一区二区日韩| 在线激情影院一区| 国产精品视频一区二区三区四| 91老司机精品视频| 九九热99久久久国产盗摄| 韩国福利视频一区| 69久久夜色精品国产69| 日韩中文字幕精品视频| 91精品在线观| 国产综合色香蕉精品| 亚洲精品永久免费精品| 97色在线播放视频| 亚洲精品电影网在线观看| 色偷偷亚洲男人天堂| 午夜精品久久久久久久久久久久| 狠狠操狠狠色综合网| 精品国产91久久久久久| 国内精品免费午夜毛片| 91av视频在线观看| 国产精品自拍视频| 欧美激情a在线| 欧美刺激性大交免费视频| 欧美精品情趣视频| 欧美日韩999| 久久午夜a级毛片| 精品国产一区二区三区四区在线观看| 欧美特黄级在线| 黑人极品videos精品欧美裸| 欧美另类极品videosbest最新版本| 国产成人啪精品视频免费网| 精品综合久久久久久97| 成人免费视频97| 久久久久中文字幕2018| 国产ts人妖一区二区三区| 亚洲的天堂在线中文字幕| 91久久嫩草影院一区二区| 欧美裸身视频免费观看| 亚洲国产精品久久| 国产精品久久久久久久av大片| 狠狠色狠狠色综合日日五| 欧洲亚洲妇女av| 亚洲欧洲日产国码av系列天堂| 最近免费中文字幕视频2019| 国产一区二区黄| 欧美性在线视频| 97在线免费视频| 久久久最新网址| 亚洲自拍偷拍第一页| 亚洲欧洲一区二区三区在线观看| www国产精品com| 亚洲成人激情视频| 欧美福利小视频| 亚洲国产精品久久久久| 久久青草精品视频免费观看| 欧美色视频日本版| 91沈先生作品| 日韩欧中文字幕| 91青草视频久久| 国产精品xxxxx| 色偷偷av一区二区三区乱| 欧美视频不卡中文| 久久国产精品首页| 成人免费淫片aa视频免费| 午夜欧美大片免费观看| 奇米4444一区二区三区| 日本精品中文字幕| 在线播放国产精品| 亚洲网站视频福利| 亚洲国产精品久久久久久| xxxx欧美18另类的高清| 久久视频在线观看免费| 日韩精品日韩在线观看| 亚洲v日韩v综合v精品v| 一本大道香蕉久在线播放29| 亚洲aⅴ日韩av电影在线观看| 日韩有码片在线观看| 亚洲国产精品资源| 最近2019中文字幕第三页视频| 国产一区二区日韩精品欧美精品| 成人免费视频a| 欧美在线播放视频| 91在线观看免费高清完整版在线观看| 欧美日韩在线第一页| 91精品国产91久久久久福利| 69久久夜色精品国产69| 久久精品国产清自在天天线| 国产精品久久一区主播| 色综合天天狠天天透天天伊人| 一区二区三区动漫| 91po在线观看91精品国产性色| 久久全球大尺度高清视频| 尤物99国产成人精品视频| 午夜精品久久久久久久久久久久久| 伊人久久大香线蕉av一区二区| 国内精品伊人久久| 欧美成人黄色小视频| 欧美日韩aaaa| 免费不卡在线观看av| 97在线精品视频| 8x拔播拔播x8国产精品| 国产日韩精品入口| 亚洲欧美变态国产另类| 上原亚衣av一区二区三区| 国产精品电影网| 国产日韩视频在线观看| 26uuu另类亚洲欧美日本老年| 欧美精品久久久久久久久久| 国产精品久久久久免费a∨| 69国产精品成人在线播放| 欧美黑人巨大精品一区二区| 91日韩在线播放| 亚洲天堂成人在线视频| 久久久久999| 一区二区三区在线播放欧美|