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

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

C++中sting類的簡單實現方法

2020-01-26 14:28:06
字體:
來源:轉載
供稿:網友

String

在C++的學習生涯我中發現String類的功能十分強大,所以我們是很有必要模擬實現它的,況且在面試的時候模擬實現一個String類也是面試官經常會考的,但是因為外界因素的限制我們是不可能模擬的和庫里的string一致的(C++庫里的string功能更強大),所以今天我們只模擬實現string的基本功能-構造函數,拷貝構造函數,析構函數,賦值運算符重載,運算符+=的重載,運算符[]的重載,c_str(得到一個C風格的字符指針,可操作字符串),Size,Push_Back,Insert(深拷貝),以及用寫時拷貝copy_on_write的方式實現基本的String類

深拷貝的方式

class String { friend ostream &operator<<(ostream &os,String &s); public: String(const char *str=""); //全缺省的構造函數,解決空字符串的問題 String(const String &ps); //深拷貝 String &operator=(String s); String &operator+=(const char * s); const char *C_Str()const //得到C風格的字符指針 { return _pstr; } char &operator[](size_t index) { return _pstr[index]; } size_t Size()const { return _size; } void PushBack(char c); String &Insert(size_t pos,const char *str); //String &operator=(String &s) //{ // cout<<"String &operator=(String &s)"<<endl; // if(this != &s) // { // delete[]_pstr; // _pstr=new char[strlen(s._pstr)+1]; // strcpy(_pstr,s._pstr); // } // return *this; //} ~String() { cout<<"~String()"<<endl; if(_pstr != NULL) { delete[]_pstr; _pstr=NULL; _size=0; _capacity=0; } } private: void CheckCapacity(int count); private: int _size; int _capacity; char *_pstr; }; ostream &operator<<(ostream &os,String &s) { os<<s._pstr; return os; } String::String(const char *str) :_size(strlen(str)) ,_capacity(strlen(str)+1) ,_pstr(new char[_capacity]) { cout<<"String()"<<endl; strcpy(_pstr,str); } String::String(const String &ps) :_size(ps._size) ,_capacity(strlen(ps._pstr)+1) ,_pstr(new char[_capacity]) { cout<<"String(const String &ps)"<<endl; strcpy(_pstr,ps._pstr); } String &String::operator=(String s) { cout<<"String &operator=(String s)"<<endl; std::swap(_pstr,s._pstr); std::swap(_size,s._size); std::swap(_capacity,s._capacity); return *this; } void String::CheckCapacity(int count) { if(_size+count >= _capacity) { int _count=(2*_capacity)>(_capacity+count)?(2*_capacity):(_capacity+count); char *tmp=new char[_count]; strcpy(tmp,_pstr); delete[]_pstr; _pstr=tmp; _capacity=_count; } } void String::PushBack(char c) { CheckCapacity(1); _pstr[_size++]=c; _pstr[_size]='/0'; } String &String::operator+=(const char * s) { CheckCapacity(strlen(s)); while(*s) { _pstr[_size++]=*s; s++; } _pstr[_size]='/0'; return *this; } String &String::Insert(size_t pos,const char *str) { char *tmp=new char[strlen(_pstr+pos)]; strcpy(tmp,_pstr+pos); CheckCapacity(strlen(str)); while(*str) { _pstr[pos++]=*str; str++; } strcpy(_pstr+pos,tmp); return *this; }

通過測試上述代碼可正常運行,特別是在實現賦值運算符重載的時候我們使用了兩種方式,值得一提的是應用swap函數來實現賦值運算符的重載(在傳參時不可以傳引用),因為應用swap函數實現是根據臨時變量的創建并且該臨時變量出作用域就會自動調用析構函數銷毀(現代的方法)

測試深拷貝的方法

void text1() { String str1("hello"); String str2(str1); String str3; str3=str1; cout<<str1<<endl; cout<<str2<<endl; cout<<str3<<endl; cout<<strlen(str1.C_Str())<<endl; //5 str1[4]='w'; cout<<str1<<endl; //hellw } void text2() { String str1("abcd"); cout<<str1<<endl; str1.PushBack('e'); str1.PushBack('f'); str1.PushBack('g'); str1.PushBack('h'); str1.PushBack('i'); cout<<str1<<endl; cout<<str1.Size()<<endl; } void text3() { String str1("hello"); String str2("hello world"); String str3(str2); str1+=" "; str1+="world"; cout<<str1<<endl; str2.Insert(6," abc "); cout<<str2<<endl; }

實現了深拷貝的方法那仫有沒有更加高效的方法呢?當然,那就是寫時拷貝,我們發現在上述深拷貝的版本里實現的拷貝構造函數又為新的對象重新開辟空間(防止淺拷貝的后遺癥:淺拷貝是值拷貝使得兩個指針指向同一塊空間,在析構該空間時對同一塊空間釋放多次就會出現問題),那仫如果我們繼承了淺拷貝的后遺癥-就讓多個指針指向同一塊空間,此時我們只需要設置一個指針變量讓它記錄指向這塊空間的指針個數,在析構時只要該指針變量的內容為1我們就釋放這塊空間否則就讓計數器減1,這就是寫時拷貝的主要思想,下面就讓我們用寫時拷貝的方法實現一個簡單的String類吧

寫時拷貝的方法

//寫時拷貝的方式 class String { friend ostream& operator<<(ostream & os,String &s); public: String(const char *str="") :_str(new char[strlen(str)+1+4]) { cout<<"構造"<<endl; _str+=4; *((int *)(_str-4))=1; strcpy(_str,str); } String(String &s) { cout<<"拷貝構造"<<endl; ++*((int *)(s._str-4)); _str=s._str; } String &operator=(const String &s) { cout<<"賦值語句"<<endl; if(--*(int *)(_str-4) == 0) { delete[](_str-4); } ++(*(int *)(s._str-4)); _str=s._str; return *this; } char &operator[](int index) //寫時拷貝 { assert(index >= 0 && index < (int)strlen(_str)); if(*(int *)(_str-4) > 1) { --*(int *)(_str-4); char *tmp=new char[strlen(_str)+5]; strcpy(tmp+4,_str); delete[](_str-4); _str=tmp+4; *(int *)(_str-4)=1; } return _str[index]; } ~String() { cout<<"析構"<<endl; if(--*(int *)(_str-4) == 0) { cout<<"釋放"<<endl; delete[](_str-4); } } private: char *_str; }; ostream& operator<<(ostream &os,String &s) { os<<s._str; return os; }

在這里我們將指針指向的計數器的位置放置在數據空間的前四個字節處

測試用例:

void test1() { String str1("abcd"); cout<<str1<<endl; String str2(str1); cout<<str2<<endl; String str3; str3=str1; cout<<str3<<endl; } void test2() { String str1("abcd"); cout<<str1<<endl; String str2; str2=str1; cout<<str2<<endl; str2[2]='w'; cout<<str2<<endl; }

以上所述是小編給大家介紹的C++中sting類的簡單實現方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类老肥妇| 色妞欧美日韩在线| 国产精品久久久久aaaa九色| 国产日韩在线一区| 欧洲精品毛片网站| 国产精品精品视频| 国产精品扒开腿做爽爽爽的视频| 91精品美女在线| 亚洲国产精品va在线看黑人动漫| zzijzzij亚洲日本成熟少妇| 亚洲精品一区av在线播放| 日韩av电影手机在线| 福利微拍一区二区| 亚洲欧美另类中文字幕| 欧美激情一二三| 国色天香2019中文字幕在线观看| 日本视频久久久| 亚洲一区二区三区香蕉| 国产精品成人av在线| 欧美精品久久久久| 国产精品美女久久| 九九久久久久久久久激情| 亚洲第一级黄色片| 精品成人69xx.xyz| 日韩精品在线视频| 亚洲欧美中文日韩v在线观看| 日韩av网站大全| 国产精品一区二区久久| 久久精品99久久香蕉国产色戒| 成人久久一区二区| 精品久久久久久亚洲精品| 亚洲性69xxxbbb| 亚洲激情第一页| 国产高清在线不卡| 欧美裸体xxxx| 国产精品久久久久久久久久新婚| 在线观看欧美日韩| 国产成人久久久精品一区| 中文字幕精品一区二区精品| 久久久女人电视剧免费播放下载| 一本色道久久88综合亚洲精品ⅰ| 国产手机视频精品| 国产成人精品av| 久久国产精品久久久久| 俺去了亚洲欧美日韩| 久久精品影视伊人网| 国产精品一区专区欧美日韩| 国产精品日韩精品| 国产丝袜一区二区| 国产精品高清免费在线观看| 海角国产乱辈乱精品视频| 国产午夜精品全部视频在线播放| 欧美极品少妇xxxxx| 国产91成人在在线播放| 国产精品国产三级国产aⅴ9色| 亚洲国内精品视频| 久久精品久久久久电影| 国产精品福利无圣光在线一区| 国产精品专区h在线观看| 亚洲欧洲日产国产网站| 国产精品h在线观看| 中文字幕亚洲无线码a| 久久精品中文字幕一区| 国产精品丝袜久久久久久高清| 欧美成人免费va影院高清| 日韩电影在线观看免费| 日韩在线中文字幕| 国产精品视频免费观看www| 欧美资源在线观看| 国产欧美 在线欧美| 国产精品高精视频免费| 精品久久久久久久大神国产| 欧美亚洲另类激情另类| 成人免费观看网址| 中文字幕国产精品| 亚洲成av人片在线观看香蕉| 久久天堂电影网| 亚洲精品视频在线观看视频| 亚洲国产婷婷香蕉久久久久久| 欧美激情久久久久| 亚洲一区二区三| 欧美日韩激情视频| 国产欧美精品va在线观看| 久久精品中文字幕一区| 国产va免费精品高清在线观看| 精品国产乱码久久久久酒店| 国产精品高清在线| 亚洲国产高潮在线观看| 中文欧美在线视频| 欧美日韩裸体免费视频| 亚洲免费视频网站| 精品一区二区三区三区| 亚洲影院色在线观看免费| 国产91热爆ts人妖在线| 国产一区二区三区直播精品电影| 久久久91精品国产一区不卡| www.99久久热国产日韩欧美.com| 欧美激情乱人伦一区| 日韩美女视频免费看| 亚洲综合中文字幕在线观看| 91九色单男在线观看| 中文字幕av一区二区三区谷原希美| 欧美精品久久久久| 亚洲一区亚洲二区亚洲三区| 国产va免费精品高清在线| 亚洲综合av影视| 亚洲欧美变态国产另类| 亚洲免费一在线| 555www成人网| 国产手机视频精品| 日韩欧美亚洲综合| 亚洲日本成人女熟在线观看| 亚洲韩国日本中文字幕| 国内精品久久久久久久久| 久久精品视频中文字幕| 日韩精品视频免费专区在线播放| 亚洲第一级黄色片| 欧美视频在线免费| 亚洲第一级黄色片| 亚洲成人在线视频播放| 97人人模人人爽人人喊中文字| 亚洲人成网站777色婷婷| 91九色国产社区在线观看| 亚洲精品影视在线观看| 精品国产一区二区三区久久久狼| 91中文精品字幕在线视频| 97国产真实伦对白精彩视频8| 色yeye香蕉凹凸一区二区av| 欧美亚洲国产日韩2020| 九九精品在线视频| 色与欲影视天天看综合网| 亚洲人午夜精品| 亚洲午夜未满十八勿入免费观看全集| 91av视频在线观看| 91久久精品视频| 国内成人精品一区| 亚洲国产精品人久久电影| 久久久久久久久久久久av| 国产成人精彩在线视频九色| 午夜精品在线观看| 亚洲无限av看| 国产成人久久久| 欧美精品免费播放| 欧美黑人视频一区| 久久久免费高清电视剧观看| 欧美日产国产成人免费图片| 国产日韩欧美中文在线播放| 久久久久久国产精品久久| 中文日韩在线观看| 精品亚洲一区二区三区| 亚洲精品aⅴ中文字幕乱码| 8x海外华人永久免费日韩内陆视频| 国产一区二区三区视频免费| 国产美女久久精品香蕉69| 性色av一区二区三区红粉影视| 亚洲黄色成人网| 亚洲国产精品电影在线观看| 欧美高清视频一区二区| 亚洲欧美日韩中文在线| 亚洲国产精品人人爽夜夜爽| 亚洲午夜av久久乱码| 国产精品久久久久久久电影| 久久国内精品一国内精品| 欧洲成人在线观看|