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

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

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

2020-01-26 13:51:23
字體:
來源:轉載
供稿:網友

詳解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先釋放空間,而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
中文字幕亚洲无线码a| 国产激情视频一区| 在线播放亚洲激情| 亚洲国产天堂久久国产91| 国产精品美女av| 亚洲精品www久久久久久广东| 在线电影欧美日韩一区二区私密| 国产精品一区二区三区久久久| 久久天天躁狠狠躁夜夜躁2014| 日本亚洲欧美成人| 欧美高清在线视频观看不卡| 亚洲欧洲国产精品| 亚洲男女性事视频| 亚洲第一级黄色片| 国内精品免费午夜毛片| 国产成人在线一区二区| 国产精彩精品视频| 亚洲精品之草原avav久久| 红桃视频成人在线观看| 欧美xxxx14xxxxx性爽| 北条麻妃一区二区三区中文字幕| 国产精品爽黄69| 久久久这里只有精品视频| 日韩在线视频播放| 久久精品99久久久香蕉| 亚洲一区二区三区xxx视频| 57pao成人国产永久免费| 国产精品91一区| 国产欧美精品日韩| 一区二区三区无码高清视频| 中文字幕免费国产精品| 国产欧美 在线欧美| 国色天香2019中文字幕在线观看| 久久天堂av综合合色| 欧美一级大胆视频| 久久久成人的性感天堂| 精品国内自产拍在线观看| 亚洲福利在线视频| 久久精品国产精品亚洲| 精品夜色国产国偷在线| 人体精品一二三区| 欧美黑人性猛交| 九九精品在线播放| 高清一区二区三区四区五区| 国产精品日韩电影| 亚洲精品视频在线播放| 欧美日韩一区二区免费视频| 久操成人在线视频| 中文国产成人精品| 日韩欧美有码在线| 欧美一级大片在线免费观看| 欧美精品激情blacked18| 韩国美女主播一区| 国产成+人+综合+亚洲欧美丁香花| www.国产精品一二区| 久久久精品999| 97视频在线观看网址| 欧美日韩在线视频一区二区| 91久久精品视频| 日韩免费在线播放| 欧美激情免费看| 美女久久久久久久| 欧美中文在线免费| 日韩av在线网| 精品久久久久久久久国产字幕| 亚洲最新在线视频| 日韩精品视频在线免费观看| 97超碰国产精品女人人人爽| 欧美一级黑人aaaaaaa做受| 亚洲精品日韩激情在线电影| 欧美重口另类videos人妖| 亚洲精品资源在线| 亚洲午夜激情免费视频| 日韩在线中文视频| 色与欲影视天天看综合网| 欧美成人第一页| 久久国产精品久久久久久| 色偷偷噜噜噜亚洲男人的天堂| 日韩电影中文字幕| 精品亚洲aⅴ在线观看| 精品毛片网大全| 精品人伦一区二区三区蜜桃网站| 亚洲国产私拍精品国模在线观看| 欧美高清不卡在线| 国产精品成av人在线视午夜片| 裸体女人亚洲精品一区| 九九久久久久久久久激情| 精品日本美女福利在线观看| 亚洲人永久免费| 777精品视频| 亚洲人成电影网站色…| 亚洲一区二区三| 亚洲成人久久久| 欧美猛交免费看| 欧美成人午夜免费视在线看片| 日韩中文字幕在线精品| 日韩精品视频观看| 国产精品久久久久久久久免费看| 亚洲午夜激情免费视频| 久久久久久久激情视频| 久久精品国产欧美激情| 国产精品美女呻吟| 亚洲成人av在线| 欧美日韩在线视频一区二区| 国产999精品视频| 成人黄色中文字幕| 日韩有码在线视频| 国产精品欧美一区二区三区奶水| 精品中文字幕在线2019| 久久久最新网址| 日韩精品在线视频| 久久精品最新地址| 57pao国产精品一区| 国产精品一区二区三区免费视频| 欧美日韩美女在线观看| 伊人久久久久久久久久| 亚洲欧美综合精品久久成人| 日韩有码片在线观看| 国产97色在线|日韩| 亚洲三级av在线| 久久久之久亚州精品露出| 国产精品v片在线观看不卡| 亚洲日韩第一页| 国产精品久久久久久久久免费| 亚洲精品国产拍免费91在线| 国产精品av在线| 91精品国产91久久久久久| 狠狠色狠狠色综合日日小说| 久久不射热爱视频精品| 久久国产一区二区三区| 久久久亚洲福利精品午夜| 久久久久久久久久国产精品| 久久夜色精品国产| 国产伦精品免费视频| 91久久久久久久久久| 欧美国产视频一区二区| 国产精品劲爆视频| 欧美日韩中国免费专区在线看| 91精品中国老女人| 久久久精品在线观看| 亚洲人成网站在线播| 亚洲精品综合久久中文字幕| 成人精品久久av网站| 91精品国产综合久久久久久久久| 久久久久久综合网天天| 亚洲国产小视频在线观看| 高清一区二区三区四区五区| 日韩经典中文字幕在线观看| 亚洲日本欧美日韩高观看| 精品久久久久久久中文字幕| 亚洲人精品午夜在线观看| 成人黄色短视频在线观看| 久热在线中文字幕色999舞| 亚洲精品午夜精品| 日韩69视频在线观看| 国产成+人+综合+亚洲欧美丁香花| 国产精品欧美日韩久久| 亚洲乱码av中文一区二区| 国产成人高潮免费观看精品| 欧美视频二区36p| 欧美性xxxx极品hd欧美风情| 高清欧美一区二区三区| 日韩精品在线视频美女| 26uuu亚洲伊人春色|