摘要:宋體另一種寫法宋體對傳值操作,不傳地址,這樣對實參構(gòu)不成影響,通過交換所指空間地址??w二現(xiàn)代寫法其他接口實現(xiàn)宋體輸入輸出宋體字符串不能通過和輸出的,而是通過調(diào)用和來操作單個字符來實現(xiàn)字符串的輸入輸出。
一、現(xiàn)代寫法實現(xiàn)接口
首先是拷貝構(gòu)造的現(xiàn)代寫法的實現(xiàn):
string_str(const string_str& st) :str(nullptr) { string_str tem(st.str); swap(this->str, tem.str);
首先先把this->str置空,temp調(diào)用構(gòu)造函數(shù),用st.str初始化this->str這樣就形成一個臨時對象,通過swap 然后把this->str和tem.str互換,這樣兩個對象指向的能存空間就互換了,出了作用域tem調(diào)用析構(gòu)函數(shù)就釋放了。這樣就保證拷貝構(gòu)造函數(shù)成功運行。
另一種寫法:
string_str& operator=( string_str s) { swap(this->str, s.str); return *this; }
對s傳值操作,不傳地址,這樣對實參構(gòu)不成影響,通過swap交換所指空間地址。
operator=現(xiàn)代寫法
// 對比下和上面的賦值那個實現(xiàn)比較好?string& operator=(string s){swap(_str, s._str);return *this;}
這和拷貝構(gòu)造另一種寫法類似,對s傳值操作,不傳地址,這樣對實參構(gòu)不成影響,通過swap交換所指空間地址。
另一種實現(xiàn)方式:
/*string& operator=(const string& s){if(this != &s){string strTmp(s);swap(_str, strTmp._str);}return *this;}*/
同樣的這和拷貝構(gòu)造函數(shù)第一種實現(xiàn)方式類似。首先先把this->str置空,temp調(diào)用構(gòu)造函數(shù),用st.str初始化this->str這樣就形成一個臨時對象,通過swap 然后把this->str和tem.str互換,這樣兩個對象指向的能存空間就互換了,出了作用域tem調(diào)用析構(gòu)函數(shù)就釋放了。這樣就保證拷貝構(gòu)造函數(shù)成功運行。
二、 現(xiàn)代寫法其他接口實現(xiàn)
輸入輸出:
ostream& operator<<( string_str& str, ostream&out) { for (size_t i = 0; i < _size; i++) { out >> str[i]; } return out; } istream& operator<<(string_str& str, istream& in) { str[0] = "/0"; _size = 0; char ch; ch = in.get(); while (ch != " " && ch != "/0"){ str += ch; ch = in.get(); } return in; }
字符串不能通過cout<
字符串的輸出實際上是對字符串中的單個字符挨個遍歷打印,
字符串的輸入是對字符插入操作,遇到空格或者回車就會結(jié)束輸入。
istream& getline( string_str& str, istream& in) { str.clear(); char ch; ch = in.get(); while ( ch != "/0") { str += ch; ch = in.get(); } return in; }
istream& getline( string_str& str, istream& in)
這個函數(shù)和operator>>底層基本相同只不過它只遇到換行結(jié)束輸入。
插入與刪除:
void insert(size_t pos, char ch) { assert(pos >= 0 && pos <= _size); if (_size >= _capasity) { size_t num = _capasity == 0 ? 4 : 2 * _capasity; this->reserve(num); } int p = _size-1; /* for (size_t i = this->_size; i >= pos; i--) { this->str[i + 1] = this->str[i]; }*/ while (true) { this->str[p + 1] = this->str[p]; p--; if (p < (int)pos) { break; } } this->_size++; this->str[pos] = ch; } void insert(size_t pos,const char* str1) { assert(pos >= 0 && pos <= _size); size_t len = strlen(str1); if (_size + len > _capasity) { this->reserve(_size + len); } int p = _size - 1; /* for (size_t i = this->_size; i >= pos; i--) { this->str[i + 1] = this->str[i]; }*/ while (true) { this->str[p + len] = this->str[p]; p--; if (p < (int)pos+len) { break; } } int j = 0; for (size_t i = pos; i < pos + len; i++) { str[i] = str1[j++]; } _size += len; str[_size] = "/0"; }
插入字符和字符串函數(shù)是函數(shù)重載,基本思想都是把pos位置到npos的字符串后移,插入字符只移動一位,而字符串姚移動len位接在在str[pos]插入ch,而字符串循環(huán)插入就行。
void erase(size_t pos, int len = -1) { assert(pos < _size&& pos >= 0); if (len == -1|| pos + len >= _size) { str[pos] = "/0"; _size = pos; } else { /* int num = pos; while (true) { str[num] = str[num + len]; num++; if (num + len == _size) { break; } } int p = _size - len; str[p] = "/0"; _size = p;*/ strcpy(str + pos, str + pos + len); int p = _size - len; str[p] = "/0"; _size -= len; } } ostream& oper
字符串的刪除分為兩種情況;
1.len為npos或pos+len大于size這樣在str[pos]插入/0就行了。
2.pos+len小于等于size把str + pos + len位置的字符串考到str + pos就可以了,str[pos]插入/0就OK了。
字符串比較:
int mystring::operator>(const mystring &s){ return strcmp(p,s.p) ;}int mystring::operator<(const char*s){ return strcmp(p,s) ;}int mystring::operator<(const mystring &s){ return strcmp(p,s.p);}int mystring::operator>(const char*s){ return strcmp(p,s);}bool mystring::operator!=(const mystring &s){ if(!strcmp(p,s.p)){ return false ; } return true ;}bool mystring::operator!=(const char * s){ if(p==NULL){ if(len ==0) return false ; else{ return true ; } } if(!strcmp(p,s)){ return false ; } else{ return true; }}bool mystring::operator==(const mystring&s){ if(strcmp(s.p,p)==0){ return true; } else{ return false; }}bool mystring::operator==(const char *s){ if(s==NULL){ if(len == 0){ return true ; } else{ return false ; } } if(strcmp(s,p)==0){ return true ; } else{ return false ; }}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/123948.html
摘要:目錄類對象的常見構(gòu)造類對象的訪問及遍歷操作迭代器介紹類對象的修改操作深淺拷貝問題深拷貝傳統(tǒng)寫法深拷貝的現(xiàn)代寫法模擬實現(xiàn)構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)交換函數(shù)拷貝賦值運算符獲取對象的成員屬性重載可讀可寫和可讀定義迭代器增容處理和函 ...
摘要:本文介紹了類的常用接口的使用,并對其進行了模擬實現(xiàn),對模擬實現(xiàn)中涉及到的深淺拷貝問題進行了解析。在此之前,必須提到一個經(jīng)典問題。為了解決淺拷貝問題,所以中引入了深拷貝。但是實際使用中需要是第一個形參對象,才能正常使用。 本文介紹了string類的常用接口的使用,并對其進行了模擬實現(xiàn),對模擬實...
摘要:在很多特性是和很類似,但是在類型系統(tǒng)中,同時支持值類型與引用類型。 現(xiàn)代編程語言對于值傳遞與引用傳遞的支持程度是比較不同的 首先介紹值傳遞與引用傳遞的概念 值傳遞 將變量a傳遞到其他的函數(shù)并對其更改,不能影響a的值 引用傳遞 在其他的作用域?qū)魅氲淖兞縜的更改可以影響a的值 Note: ? 在這里的值的概念,對于原始類型,指的就是字面的值,如1,2,a; ? 而對于動態(tài)內(nèi)存...
摘要:在很多特性是和很類似,但是在類型系統(tǒng)中,同時支持值類型與引用類型。 現(xiàn)代編程語言對于值傳遞與引用傳遞的支持程度是比較不同的 首先介紹值傳遞與引用傳遞的概念 值傳遞 將變量a傳遞到其他的函數(shù)并對其更改,不能影響a的值 引用傳遞 在其他的作用域?qū)魅氲淖兞縜的更改可以影響a的值 Note: ? 在這里的值的概念,對于原始類型,指的就是字面的值,如1,2,a; ? 而對于動態(tài)內(nèi)存...
摘要:我希望的是類似中文字符這樣的使用體驗。中文中文這里的遍歷就類似中文中文我們這里干的事情類似于里兩種類型的區(qū)分。 致力于在現(xiàn)代C++中提供Python的編程體驗。這個建立在兩個關(guān)鍵的基礎(chǔ)上 c++ 11/14/17 提供了從 auto 到 structure binding 的語法便利 https://ericniebler.github.io... 提供的 range 抽象 但是 ...
閱讀 3119·2021-11-19 09:40
閱讀 1576·2021-11-15 11:39
閱讀 690·2021-10-08 10:05
閱讀 2289·2021-09-03 10:29
閱讀 3419·2021-08-12 13:22
閱讀 2191·2019-08-30 15:54
閱讀 3725·2019-08-30 14:03
閱讀 2664·2019-08-30 13:45