看到《accelerated c++》的乙個string類的簡單實現,學到了許多操作符和型別轉換的東西,記錄下來,備忘。。。
str.h
#include
#include
#include
#include "vec.h"
class str
//預設建構函式
str(size_type n,char c):data(n,c) {} //有連個引數(數目,字元)構造數目的字元的字串
str(const char* p)
//從迭代器b和e之間的元素建立乙個string
template str(in b,in e)
//operator索引操作符
char& operator (size_type i)
const char& operator (size_type i) const
//連線操作符 ①s=s+s1;②s+=s1
str& operator += (const str& s)
//定義大小
size_type size() const
private:
vec data;};
//輸入-輸出操作符
//判斷乙個函式時候應該是成員函式,我們前面章節有個標準:看看這個操作是否會影響物件的狀態
//輸入操作當然改變物件了,應該把它當做str的成員函式嗎?
//不可以,原因:對於乙個二元操作符(如cin>>s),左運算元總是與第乙個引數繫結,但是對於
//成員操作符函式來說,第乙個引數隱式的為此成員函式的物件,所以cin>>s表示的應該是
//cin中得成員函》,但是istream是沒有定義許可權的。所以我們要想使cin>>s成立,就必須
//決定:輸入操作符必須是乙個非成員函式,同理,輸入也是
std::istream& operator>> (std::istream&,str&);
std::ostream& operator<< (std::ostream&,const str&);
str operator + (const str& ,const str& );//加法運算子的過載(不會改變任何值,所以類外定義)
str.cpp
#include "str.h"
using namespace std;
//我們呼叫str::operator-->vec::operator;類似呼叫s.size()-->vec物件的size
ostream& operator<< (ostream& os,const str& s)
return os;
}istream& operator>> (istream& is,str& s)
if (is) //判斷是否讀取結束
while (is.get(c)&&!isspace(c));
if (is) //判斷是否讀取結束
}return is;
}//加法
str operator + (const str& s,const str& t )
另外,再說明兩點:
1. 二元操作符問題
+=操作符,改變了它的左運算元,所以應該定義為類str的成員;
注意:如果乙個類支援型別轉換,那麼把二元操作符定義為非成員函式是乙個很好的習慣。
如果乙個操作符是乙個類的成員,那麼這個操作符的左運算元就不能事自動型別轉換的結果。
非成員操作符的左運算元以及任意操作符的右運算元,都遵循與普通函式引數相同的規則:運算元可以是任意型別,只要它能轉換層引數型別。
+操作符,應該為非成員函式,應為如果是成員函式,左右運算元就不對稱了(右運算元可以自動型別轉換,左運算元不可以)
+操作符的返回應該是左值,不應該是引用。(c++ primer解釋:算術運算子通常產生乙個新值,該值是兩個運算元的計算結果,它不同於任一運算元,並且在乙個區域性變數的計算中返回對那個變數的引用是乙個執行時錯誤。)
2. 型別轉換操作符(conversion operator)(從類到其他型別,與建構函式相反)
定義:這種操作符可以說明如何把這個類的物件轉換為目標型別。型別轉換操作符必須被定義為類的成員。格式:operator 目標型別,如 operator double
事實上,我們每次編寫隱式的檢測乙個istream物件的值的迴圈式,都會使用這種型別轉換操作符。如,while(cin)
原理:標準庫定義了從istream到void*的型別轉換istream operator void*() 。void*可以轉化為bool型,所以上例成立。
延伸:為什麼istream不定義operator bool 直接把cin轉換為bool?
考慮 int x; cin<>x;) 此時,operator bool 直接把cin轉換為bool,生成的的bool值會轉換成int型別,然後把這個值左移x位,最後丟棄生成的結果。
注:通過定義轉換為void*的操作,而不是轉換為算術型別,標準庫既可以使乙個istream物件能用作乙個條件式,也可以阻止它被用作乙個算術值。
摘自 csqlwy
乙個string類的簡單實現
string類中使用到了賦值建構函式 複製建構函式 建構函式 預設建構函式 析構函式 過載操作符等一些類操作 class string string const char str string const char str,int n string const string src 拷貝建構函式 也...
乙個string類的簡單實現案例
string類中使用到了賦值建構函式 複製建構函式 建構函式 預設建構函式 析構函式 過載操作符等一些類操作 class string string const char str string const char str,int n string const string src 拷貝建構函式 也...
C 探幽 實現乙個簡單的string類
class mystring mystring mystring const char p null else mystring mystring const mystring str 需要實現深拷貝 else mystring mystring operator const mystring st...