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

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

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

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

詳解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
青青草一区二区| 日韩久久免费视频| 国产成人精品一区| 亚洲精品99久久久久中文字幕| 亚洲欧美另类自拍| 日韩av一区二区在线观看| 欧美精品生活片| 色噜噜狠狠狠综合曰曰曰88av| 亚洲午夜精品久久久久久久久久久久| 国产丝袜精品第一页| 亚洲成人精品视频在线观看| 日韩欧美在线观看视频| 亚洲精品国产欧美| 欧美在线视频观看免费网站| 亚洲人成伊人成综合网久久久| 91精品国产自产在线观看永久| 国产精品香蕉国产| 欧美日韩一区二区免费视频| 中文字幕9999| 91精品久久久久久久久| 色午夜这里只有精品| 亚洲精品美女免费| 久久人人爽人人爽人人片av高请| 97精品视频在线播放| 欧美激情视频一区二区| 粗暴蹂躏中文一区二区三区| 亚洲电影免费观看高清完整版在线观看| 在线观看成人黄色| www.精品av.com| 日韩电视剧免费观看网站| 久久精视频免费在线久久完整在线看| 亚洲国产私拍精品国模在线观看| 45www国产精品网站| 久久精彩免费视频| 欧美一性一乱一交一视频| 成人精品福利视频| 国产精品永久免费| 久久久久久噜噜噜久久久精品| 欧美精品18videos性欧美| 亚洲国产精品人久久电影| 欧美乱大交做爰xxxⅹ性3| 成人精品在线观看| 欧美在线视频网站| 亚洲黄一区二区| 韩国三级日本三级少妇99| 欧美性69xxxx肥| 国自产精品手机在线观看视频| 欧美激情视频网| 欧美综合一区第一页| 91理论片午午论夜理片久久| 国产v综合ⅴ日韩v欧美大片| 91sao在线观看国产| 一本一本久久a久久精品牛牛影视| 久久精品久久精品亚洲人| 成人欧美一区二区三区在线湿哒哒| 欧美孕妇性xx| 亚州国产精品久久久| 日韩精品免费在线| 亚洲男子天堂网| 亚洲精品wwww| 亚洲成人精品av| 日本免费一区二区三区视频观看| 日韩黄色高清视频| 成人免费网站在线看| 国产日韩综合一区二区性色av| 91极品视频在线| 亚洲欧美日韩国产精品| 精品夜色国产国偷在线| 亚洲精品日韩av| 久久国产精品99国产精| 日韩精品久久久久久福利| 98精品国产自产在线观看| 亚洲在线一区二区| 青青草精品毛片| 亚洲欧洲激情在线| 国产成人精品免费视频| www亚洲精品| 在线播放国产一区二区三区| 国产噜噜噜噜噜久久久久久久久| 国产欧美精品久久久| 成人网在线观看| 久久久久久一区二区三区| 久久久久国色av免费观看性色| xxxx欧美18另类的高清| 日韩中文理论片| 精品自拍视频在线观看| 精品福利免费观看| 2020欧美日韩在线视频| 国产福利精品在线| 久久久久久久久久久av| 亚洲人av在线影院| 国产精品男女猛烈高潮激情| 国产视频亚洲视频| 欧美成人四级hd版| 欧美性猛交xxxx免费看漫画| 日韩专区在线观看| 亚洲日韩中文字幕| 久久久久久香蕉网| 日韩精品亚洲视频| 国产网站欧美日韩免费精品在线观看| 国产精品扒开腿爽爽爽视频| 三级精品视频久久久久| 亚洲精品久久久一区二区三区| 国产欧美日韩专区发布| 在线日韩精品视频| 欧美日本精品在线| 精品亚洲永久免费精品| 日韩免费观看av| 91av免费观看91av精品在线| xxxx欧美18另类的高清| 亚洲最大激情中文字幕| 久久精品久久久久久国产 免费| 欧美国产亚洲精品久久久8v| 国产精品中文字幕在线观看| 亚洲福利视频二区| 国产精品视频中文字幕91| 国产成人精品日本亚洲专区61| 午夜精品久久久久久99热| 午夜美女久久久久爽久久| 久久中国妇女中文字幕| 亚洲天堂成人在线视频| 俺去了亚洲欧美日韩| 欧美激情一区二区三级高清视频| 欧美日韩一区二区在线播放| 91网站免费看| 日韩亚洲精品视频| 国产欧美日韩精品丝袜高跟鞋| 中文字幕亚洲在线| 米奇精品一区二区三区在线观看| 欧美日韩加勒比精品一区| 亚洲人成电影网| 亚洲成年人影院在线| 国产91精品最新在线播放| 91免费观看网站| 精品亚洲一区二区三区在线观看| 久久久久久12| 亚洲男人第一网站| 日韩精品免费在线视频| www.亚洲一二| 亚洲精品福利在线观看| 久久99久久99精品中文字幕| 91九色综合久久| 欧美自拍视频在线观看| 97超级碰碰人国产在线观看| 精品日本美女福利在线观看| 欧美性极品少妇精品网站| 午夜免费在线观看精品视频| 4p变态网欧美系列| 精品国产一区二区三区久久狼5月| 欧美日韩国产精品一区| 亚洲国内高清视频| 欧美性感美女h网站在线观看免费| 2018国产精品视频| 日韩电影在线观看永久视频免费网站| 欧美片一区二区三区| 欧美亚洲免费电影| 91精品国产九九九久久久亚洲| 久久久国产精品一区| 91国内揄拍国内精品对白| 国产欧美一区二区三区久久| 亚洲福利小视频| 成人动漫网站在线观看| 久久在线精品视频| 草民午夜欧美限制a级福利片|