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

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

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

2020-02-24 14:30:33
字體:
來源:轉載
供稿:網友

簡單地說,淺拷貝現有內存添加一個指針,深度復制添加指針,并為指針打開一個新空間,以指向新打開的空間,本文是詳解C++中String類模擬實現以及深拷貝淺拷貝,希望能幫助到您。

詳解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
成人激情视频在线播放| 亚洲美女福利视频网站| 欧美乱大交做爰xxxⅹ性3| 国产精品一区二区性色av| 亚洲精品国产精品国产自| 色综合色综合网色综合| 最近2019年中文视频免费在线观看| 尤物yw午夜国产精品视频明星| 久久久噜噜噜久久中文字免| 亚洲第五色综合网| 亚洲人免费视频| 6080yy精品一区二区三区| 奇米4444一区二区三区| 亚洲国产精品小视频| 久久精品91久久香蕉加勒比| 成人h视频在线观看播放| 成人免费淫片aa视频免费| 91亚洲午夜在线| 国产精品三级美女白浆呻吟| 中文字幕精品在线视频| 欧美成aaa人片免费看| 亚洲成人网在线观看| xxxxxxxxx欧美| 亚洲欧洲在线视频| 国产精品美乳在线观看| 国产精品免费一区二区三区都可以| 欧美怡红院视频一区二区三区| 国产欧美精品在线| 亚洲美女免费精品视频在线观看| 精品无人区乱码1区2区3区在线| 日韩av影院在线观看| 国产98色在线| 欧美午夜精品在线| 午夜精品国产精品大乳美女| 中文字幕少妇一区二区三区| 亚洲四色影视在线观看| 亚洲天堂视频在线观看| 欧美大片第1页| 亚洲成人精品在线| 日产日韩在线亚洲欧美| 中文字幕少妇一区二区三区| 最近2019中文免费高清视频观看www99| 国产激情久久久| 久久久免费观看视频| 日韩免费在线免费观看| 国产在线日韩在线| 日本高清不卡在线| 欧美性videos高清精品| 亚洲欧美激情四射在线日| 欧美日韩亚洲精品内裤| 在线视频日韩精品| 日韩在线观看av| 精品国产精品三级精品av网址| 亚洲第一区中文字幕| 欧美日韩另类视频| 色综合色综合久久综合频道88| 中文字幕不卡在线视频极品| 亚洲国产日韩欧美在线图片| 88国产精品欧美一区二区三区| 国产精品一区二区久久国产| 日韩欧美亚洲范冰冰与中字| 久久精品国产欧美激情| 国产欧美一区二区白浆黑人| 欧美贵妇videos办公室| 国产美女扒开尿口久久久| 97久久超碰福利国产精品…| 日韩在线高清视频| www.日本久久久久com.| 国产精品扒开腿做爽爽爽的视频| 欧美激情第1页| 久久国产精品电影| 日韩经典中文字幕| 成人性生交xxxxx网站| 成人精品视频久久久久| 国产91色在线免费| 国产91精品久久久久| 九九热在线精品视频| 日本午夜精品理论片a级appf发布| 91精品久久久久久久久中文字幕| 成人97在线观看视频| 日韩精品黄色网| 国产视频一区在线| 欧美与黑人午夜性猛交久久久| 久久五月天色综合| 亚洲精品v欧美精品v日韩精品| 亚洲www在线观看| 国产精品91免费在线| 国产在线久久久| 97视频免费在线观看| 国产成人97精品免费看片| 久久久久久久国产精品| 久久久久亚洲精品| 中文字幕日韩欧美在线视频| 欧美丰满少妇xxxx| 亚洲国产精品电影| 亚洲在线免费看| 欧美日韩午夜视频在线观看| 欧美性极品少妇精品网站| 日韩精品免费在线观看| 欧美激情综合亚洲一二区| 日韩美女视频中文字幕| 国产精品国产福利国产秒拍| 日韩欧美中文字幕在线观看| 亚洲精品国产美女| 欧美视频中文字幕在线| 久久精视频免费在线久久完整在线看| 欧美国产极速在线| 亚洲电影免费观看高清完整版在线观看| 国产精品久久久999| 亚洲xxxxx性| 日韩精品免费在线播放| 粉嫩老牛aⅴ一区二区三区| 久久久久成人网| 中文字幕日本欧美| 久久综合色影院| 色婷婷久久一区二区| 国产日韩欧美自拍| 欧美激情第1页| 中国日韩欧美久久久久久久久| 欧美日韩亚洲激情| 亚洲美女在线观看| 成人欧美一区二区三区黑人孕妇| 久久av红桃一区二区小说| 亚洲高清免费观看高清完整版| 大荫蒂欧美视频另类xxxx| 国产精品成熟老女人| 欧美大片网站在线观看| 成人h视频在线观看播放| 全亚洲最色的网站在线观看| 亚洲国产天堂久久综合网| 成人黄色在线观看| 欧美老妇交乱视频| 亚洲欧美日韩国产中文| 国产精品免费在线免费| 欧美成人三级视频网站| 国产精品69久久| 国产精品久久久久久久久久ktv| 在线日韩中文字幕| 国产视频精品xxxx| 精品久久香蕉国产线看观看亚洲| 久久男人的天堂| 曰本色欧美视频在线| 日韩大陆毛片av| 国产亚洲美女久久| 欧美第一黄色网| 国产精品丝袜视频| 亚洲精品视频网上网址在线观看| xx视频.9999.com| 国产成人精品av在线| 欧美日韩国产精品一区二区不卡中文| 91精品国产综合久久久久久久久| 亚洲free性xxxx护士白浆| 57pao国产精品一区| 91av视频在线| 一本一本久久a久久精品综合小说| 亚洲黄页视频免费观看| 亚洲欧美中文日韩在线v日本| 国产精品久久久久久久久久久新郎| 久久久久久美女| 成人免费视频网| 色偷偷偷综合中文字幕;dd| 日韩av免费一区| 亚洲开心激情网| yw.139尤物在线精品视频|