摘要:宋體另一種寫法宋體對傳值操作,不傳地址,這樣對實參構不成影響,通過交換所指空間地址。楷體二現代寫法其他接口實現宋體輸入輸出宋體字符串不能通過和輸出的,而是通過調用和來操作單個字符來實現字符串的輸入輸出。
一、現代寫法實現接口
首先是拷貝構造的現代寫法的實現:
string_str(const string_str& st) :str(nullptr) { string_str tem(st.str); swap(this->str, tem.str);
首先先把this->str置空,temp調用構造函數,用st.str初始化this->str這樣就形成一個臨時對象,通過swap 然后把this->str和tem.str互換,這樣兩個對象指向的能存空間就互換了,出了作用域tem調用析構函數就釋放了。這樣就保證拷貝構造函數成功運行。
另一種寫法:
string_str& operator=( string_str s) { swap(this->str, s.str); return *this; }
對s傳值操作,不傳地址,這樣對實參構不成影響,通過swap交換所指空間地址。
operator=現代寫法
// 對比下和上面的賦值那個實現比較好?string& operator=(string s){swap(_str, s._str);return *this;}
這和拷貝構造另一種寫法類似,對s傳值操作,不傳地址,這樣對實參構不成影響,通過swap交換所指空間地址。
另一種實現方式:
/*string& operator=(const string& s){if(this != &s){string strTmp(s);swap(_str, strTmp._str);}return *this;}*/
同樣的這和拷貝構造函數第一種實現方式類似。首先先把this->str置空,temp調用構造函數,用st.str初始化this->str這樣就形成一個臨時對象,通過swap 然后把this->str和tem.str互換,這樣兩個對象指向的能存空間就互換了,出了作用域tem調用析構函數就釋放了。這樣就保證拷貝構造函數成功運行。
二、 現代寫法其他接口實現
輸入輸出:
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<
字符串的輸出實際上是對字符串中的單個字符挨個遍歷打印,
字符串的輸入是對字符插入操作,遇到空格或者回車就會結束輸入。
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)
這個函數和operator>>底層基本相同只不過它只遇到換行結束輸入。
插入與刪除:
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"; }
插入字符和字符串函數是函數重載,基本思想都是把pos位置到npos的字符串后移,插入字符只移動一位,而字符串姚移動len位接在在str[pos]插入ch,而字符串循環插入就行。
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 ; }}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123948.html
摘要:目錄類對象的常見構造類對象的訪問及遍歷操作迭代器介紹類對象的修改操作深淺拷貝問題深拷貝傳統寫法深拷貝的現代寫法模擬實現構造函數拷貝構造函數交換函數拷貝賦值運算符獲取對象的成員屬性重載可讀可寫和可讀定義迭代器增容處理和函 ...
摘要:本文介紹了類的常用接口的使用,并對其進行了模擬實現,對模擬實現中涉及到的深淺拷貝問題進行了解析。在此之前,必須提到一個經典問題。為了解決淺拷貝問題,所以中引入了深拷貝。但是實際使用中需要是第一個形參對象,才能正常使用。 本文介紹了string類的常用接口的使用,并對其進行了模擬實現,對模擬實...
摘要:在很多特性是和很類似,但是在類型系統中,同時支持值類型與引用類型。 現代編程語言對于值傳遞與引用傳遞的支持程度是比較不同的 首先介紹值傳遞與引用傳遞的概念 值傳遞 將變量a傳遞到其他的函數并對其更改,不能影響a的值 引用傳遞 在其他的作用域對傳入的變量a的更改可以影響a的值 Note: ? 在這里的值的概念,對于原始類型,指的就是字面的值,如1,2,a; ? 而對于動態內存...
摘要:在很多特性是和很類似,但是在類型系統中,同時支持值類型與引用類型。 現代編程語言對于值傳遞與引用傳遞的支持程度是比較不同的 首先介紹值傳遞與引用傳遞的概念 值傳遞 將變量a傳遞到其他的函數并對其更改,不能影響a的值 引用傳遞 在其他的作用域對傳入的變量a的更改可以影響a的值 Note: ? 在這里的值的概念,對于原始類型,指的就是字面的值,如1,2,a; ? 而對于動態內存...
摘要:我希望的是類似中文字符這樣的使用體驗。中文中文這里的遍歷就類似中文中文我們這里干的事情類似于里兩種類型的區分。 致力于在現代C++中提供Python的編程體驗。這個建立在兩個關鍵的基礎上 c++ 11/14/17 提供了從 auto 到 structure binding 的語法便利 https://ericniebler.github.io... 提供的 range 抽象 但是 ...
閱讀 3115·2021-11-19 09:40
閱讀 1573·2021-11-15 11:39
閱讀 688·2021-10-08 10:05
閱讀 2284·2021-09-03 10:29
閱讀 3416·2021-08-12 13:22
閱讀 2185·2019-08-30 15:54
閱讀 3724·2019-08-30 14:03
閱讀 2663·2019-08-30 13:45