運算子過載的兩種方式
對於很多運算子來說,可以選擇使用成員函式或非成員函式來實現運算子過載。一般來說非成員函式應該是友元函式,這樣才能直接訪問類的私有資料。例如,time類的加法運算子在time類宣告中的原型為:
time operator+(const time &t) const; //member version
這個成員函式的宣告方式。
這個函式的宣告也可以使用友元函式的方式:
friend time operator+(const time &t1, const time &t2) //nonmember version
加法運算需要兩個運算元,對於成員函式版本,乙個運算元通過this指標隱式地傳遞,另乙個運算元作為函式引數顯式的傳遞;對於友元函式的版本來說,兩個運算元都作為引數來傳遞。
這兩個原型都與表示式t2 + t3匹配,其中t2和t3都是time型別物件。也就是說,編譯器將下面的語句:
t1 = t2 + t3;轉換為下面的任何乙個:
t1 = t2.operator+(t3); //member function
t1 = operator+(t2, t3); //nonmember function
記住,在選擇運算子時,必須選擇其中的一種格式,不能同時選擇兩種格式。因為這兩種格式都與同乙個表示式匹配,同時定義這兩種格式將被視為二義性錯誤,導致編譯錯誤。
那麼哪一種格式最好呢?對於某些運算子來說,成員函式是唯一合法的選擇,比如說自增的operator++運算,operator=運算。在其他情況下,這兩種格式並沒有太大的區別。
運算子過載的返回型別
過載運算子的返回值無非就兩種:返回物件和返回物件的引用。
想operator+這樣的運算子,兩個運算元相加然後賦值給另外乙個物件,這種的要返回乙個新的物件,不能返回乙個物件的引用,至於原因看條款21。返回乙個物件也能夠相容a+b+c這樣的語句。
但是對於operator=這樣的運算子,只能用成員函式寫,要返回乙個物件的引用的,其實不返回任何東西也是可以的,返回物件的引用,為的就是相容a=b=c這樣的操作。為什麼不返回乙個const的物件的引用呢?為了相容(a=b)=c這樣的操作。
C 過載運算子
運算子過載是一種形式的c 多型。在c 中,編譯器有能力把乙個由資料 物件和操作符共同組成的表示式,解釋為對乙個全域性或成員函式的呼叫。該全域性或成員函式被稱為操作符函式,通過重定義操作符函式,可以實現針對自定義型別 結構,類 的運算法則,並使之與內建型別一樣參與各種表示式。過載運算子可使 看起來更加...
C 過載運算子
本文主要講述加號運算子 自增運算子 流提取運算子運 流插入運算子 先給出vector類 class vector 建構函式 vector const vector v 拷貝建構函式 vector operator const vector v 過載 vector operator 過載前置自增運算子...
C 過載運算子
過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。如果我們定義的函式為類的成員函式 box operator const box 如果我們定義的函式為非成員函式,那麼我們需要為每次操作傳遞兩個...