模拟实现string其中的一些知识点
生活随笔
收集整理的這篇文章主要介紹了
模拟实现string其中的一些知识点
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
知識點列舉
使用初始化列表的好處
拷貝構造的形參為&與值的區(qū)別
??如果拷貝構造函數(shù)的形參用值,由于類中沒有這個對象,就要調用拷貝構造函數(shù)來創(chuàng)建,以此類推,會造成無限遞歸循環(huán)
//拷貝構造函數(shù)String(const String& s):_str(new char[s._capacity + 1]), _capacity(s._capacity), _size(s._size){strcpy(_str, s._str);}深拷貝與淺拷貝
形參使用&的好處
??形參是對象的引用,是通過傳地址的方法傳遞參數(shù)的,對函數(shù)形參的改變就是對實參的改變,如果函數(shù)的形參是對象,則是通過傳值的方法傳遞參數(shù)的,函數(shù)體內對形參的修改無法傳到函數(shù)體外。
運算符重載部分
//運算符重載部分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的好處
string中部分接口的模擬實現(xiàn)
//尾插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){/*自己實現(xiàn)memset函數(shù)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) {//統(tǒng)計pos之后的所有字符數(shù)量int len = strlen(_str + pos); //如果size超過了字符串實際長度,將size設置為pos之后的所有字符數(shù)量if (len < size) size = len;//將_str中從pos位置開始的字符串傳遞size個回去return String(_str + pos, size); } //析構函數(shù)~String(){if (_str){delete[] _str;_str = nullptr;_capacity = 0;_size = 0;}}private:char* _str;size_t _capacity; //容量size_t _size; //有效字符的個數(shù)const static int npos; };const int String::npos = -1; 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的模拟实现string其中的一些知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fiddler (二) : Script
- 下一篇: Python 使用 smtp ssl 模