日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟实现string其中的一些知识点

發布時間:2024/7/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟实现string其中的一些知识点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知識點列舉

  • 使用初始化列表的好處
  • 拷貝構造的形參為&與值的區別
  • 深拷貝與淺拷貝
  • 使用&的好處
  • 形參使用const引用的好處
  • 使用初始化列表的好處

  • 類成員中存在常量,如const int a,只能用初始化不能復制
  • 類成員中存在引用,同樣只能使用初始化不能賦值。類成員中存在引用,同樣只能使用初始化不能賦值。
  • 提高效率:對類類型來說,用初始化列表少了一次調用默認構造函數的過程,
  • //模擬實現stringclass String {public://構造函數String(const char* str =“”)_size(strlen(str)), _str(new char[_size + 1]),_capacity( _size){strcpy(_str, str);}String(char* str, size_t size)_size(size),_capacity(size),_str(_str = new char[size + 1]){strncpy(_str, str, size);}

    拷貝構造的形參為&與值的區別

    ??如果拷貝構造函數的形參用值,由于類中沒有這個對象,就要調用拷貝構造函數來創建,以此類推,會造成無限遞歸循環

    //拷貝構造函數String(const String& s):_str(new char[s._capacity + 1]), _capacity(s._capacity), _size(s._size){strcpy(_str, s._str);}

    深拷貝與淺拷貝

  • 淺拷貝:也稱位拷貝,編譯器只是直接將指針的值全部拷貝過來,從而造成對個對象使用同一塊空間,當一個對象將這塊內存釋放掉之后,另一些對象不知道該塊空間已經還給了系統,以為還有效,依舊會對這塊空間進行釋放,在對這段內存進行釋放操作的時候,一個內存空間被釋放多次,發生了訪問違規,導致程序崩潰。
  • 深拷貝:為了解決淺拷貝的問題,深拷貝則不是直接將指針的值拷貝,是為指針_str開辟與str相同大小的內存空間,然后將str中的資源拷貝到_str中,這樣雖然_str與str中的資源一樣,但是使用的是兩塊獨立的空間,所以delete時只釋放這個對象自己的內存,不會出現訪問違規。
  • //賦值運算符String operator=(const String& s){if (this != &s){char* pStr = new char[s._capacity + 1];strcpy(pStr, _str);delete[] _str;_str = pStr;_capacity = s._capacity;_size = s._size;}return *this;}

    形參使用&的好處

    ??形參是對象的引用,是通過傳地址的方法傳遞參數的,對函數形參的改變就是對實參的改變,如果函數的形參是對象,則是通過傳值的方法傳遞參數的,函數體內對形參的修改無法傳到函數體外。

    運算符重載部分

    //運算符重載部分bool operator<(const String& s){return !strcmp(_str, s._str);}bool operator<=(const String& s){if (strcmp(_str, s._str) == 1)return npos;return 1;}bool operator>(const String& s){return strcmp(_str, s._str);}bool operator>=(const String& s){if (strcmp(_str, s._str) != 1)return npos;return 1;}bool operator==(const String& s){return (strcmp(_str, s._str) == 0);}bool operator!=(const String& s){return (strcmp(_str, s._str) != 0);}friend ostream& operator<<(ostream& _cout, const String& s){_cout << s._str;return _cout;}friend istream& operator>>(istream& _cin, String& s){_cin >> s._str;return _cin;}

    形參使用const的好處

  • 當實參的類型比較大時,復制開銷很大,引用會“避免復制”。
  • “避免修改實參”,當使用引用時,如果調用者希望只使用實參并不修改實參,則const可以避免使用該引用修改實參。
  • string中部分接口的模擬實現

    //尾插void PushBack(char c){//CheckCapacity();_str[_size++] = c;_str[_size] = '\0';}//追加字符串void Append(const char* str) {//判斷對象中的剩余空間是否能夠放下,放不下就開辟新空間int len = strlen(str);if (len > _capacity - _size)Reserve(2 * _capacity + len);strcat(_str, str);}char& operator[](size_t index){return _str[index];}const char& operator[](size_t index)const //at與[]唯一不同的方式是前者越界會拋出異常,后者越界會崩潰,或者給隨機值{return _str[index];}void Reserve(size_t newCapacity){if (_capacity <= newCapacity && _capacity != newCapacity){char* pStr = new char[newCapacity + 1];strcpy(pStr, _str);delete[] _str;_str = pStr;_capacity = newCapacity;}}void ReSize(size_t newSize, char c){if (newSize > _size){/*自己實現memset函數size_t size = _size;for (size_t i = 0; i < newSize; ++i){pStr[size++] = c;}delete[] _str;_str = pStr;*/Reserve(newSize);memset(_str + _size, c, newSize - _size);_str[newSize] = '\0';_capacity = newSize;}else if (newSize < _size){/*char* pStr = new char[newSize + 1];for (size_t i = 0; i < newSize; ++i){pStr[i] = _str[i];}delete[] _str;_str = pStr;*/memset(_str + newSize, '\0', 1);}_size = newSize;}int Size()const{return _size;}bool Empty()const{return (0 == _size);}int Find(char c, size_t pos = 0){for (size_t i = pos; i < _size; ++i){if (c == _str[i])return i;}return npos;}int rFind(char c){for (size_t i = _size - 1; i > 0; --i){if (c == _str[i])return i;}return npos;}//返回c格式的字符串const char* C_str()const //返回c格式的字符串{return _str;}void Swap(String& s){swap(_str, s._str);swap(_size, s._size);swap(_capacity, s._capacity);}//從_str中返回從pos開始的size個字符的子字符串String StrSub(size_t pos, size_t size) {//統計pos之后的所有字符數量int len = strlen(_str + pos); //如果size超過了字符串實際長度,將size設置為pos之后的所有字符數量if (len < size) size = len;//將_str中從pos位置開始的字符串傳遞size個回去return String(_str + pos, size); } //析構函數~String(){if (_str){delete[] _str;_str = nullptr;_capacity = 0;_size = 0;}}private:char* _str;size_t _capacity; //容量size_t _size; //有效字符的個數const static int npos; };const int String::npos = -1; 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的模拟实现string其中的一些知识点的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。