C 過載運算子

2022-04-10 13:12:21 字數 1132 閱讀 8287

運算子過載的兩種方式

對於很多運算子來說,可以選擇使用成員函式或非成員函式來實現運算子過載。一般來說非成員函式應該是友元函式,這樣才能直接訪問類的私有資料。例如,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 如果我們定義的函式為非成員函式,那麼我們需要為每次操作傳遞兩個...