關於有些運算子只能用成員函式過載

2021-08-21 19:39:03 字數 1274 閱讀 4389

1.=,,(),->只能通過成員函式來過載

c++規定賦值運算子「=」只能過載為類的非靜態成員函式,而不可以過載為類的友元函式。

不能過載為類的靜態成員應該比較容易理解,因為靜態成員函式是屬於整個類的,不是屬於某個物件的,它只能去操作類靜態資料成員。而賦值運算子「=」是基於物件操作的。

那麼為什麼賦值運算子不可以過載為類的友元函式?像同樣都是雙目運算子的+為什麼它就可以呢?

列印結果為:test aa

test a

所以c++在a=5時自動呼叫了建構函式,說明在類a中已經有相應賦值運算子過載函式的時候,執行賦值語句a = 5;程式會去呼叫類a中相應的賦值運算子過載函式。

當在類中定義了乙個=的過載函式,列印結果則為test aa;test aaa; 而沒有去掉用有參建構函式

在此,我們可以對c++規則做出以下的判斷:

當 類中沒有定義賦值運算子過載成員函式時(注意,在未定義形參資料型別為該類型別的賦值運算子過載函式時,編譯器會自動生成加入),當程式執行到某一賦值語 句時,程式就會呼叫與賦值語句中右值型別匹配的建構函式,而把這右值當作此建構函式的實參。像最初的賦值語句a = 5,執行時,實際做的操作是a(5)。而當類中有定義賦值運算子過載成員函式,執行賦值語句時,程式就只會去呼叫相應的賦值運算子過載函式。

我們知道友元函式不是類的成員函式,它只是類的「朋友「,具有訪問把它宣告為「朋友」的類的資料成員的許可權而已。

那麼當把賦值運算子過載為類的友員函式,在程式中執行類物件的賦值語句時,程式就會出現兩種矛盾的選擇。

1、因為它認為類中並沒有過載賦值運算子的成員函式,所以它根據c++的規則,會去呼叫相應的建構函式。

2、但是在全域性裡,我們已經過載了引數型別為此類型別的賦值運算子函式,而這賦值語句剛好和這函式匹配上了,根據c++的規則,也會去呼叫這函式。

程式是不允許有矛盾不確定選擇的,所以當賦值運算子過載為類的友元函式時,編譯器就會提示錯誤。

對於剩下的3個運算子 ->, , () 為什麼不能過載為友元函式,也是跟上面一樣的道理。即編譯器發現當類中沒有定義這3個運算子的過載成員函式時,就會自己加入預設的運算子過載成員函式。因此這四個運算子寫成友元函式時會報錯,產生矛盾。

關於非成員運算子和成員運算子的區別

運算子的過載一般我們會使用以下兩種形式 成員函式 非成員函式 其實這兩種定義不僅在語法上,在語義上也是有差別的。語法上,定義為成員函式,比如 operator 只接受乙個引數,而非成員函式接受2個引數語義上,這涉及到臨時物件無法繫結到左值引用的問題,比如我們過載operator operator s...

運算子過載 成員函式

檔名稱 test.cpp 完成日期 2016年5月14日 問題描述 請用類的成員函式,定義複數類過載運算子 使之能用於複數的加減乘 include using namespace std class complex complex double r,double i complex operator...

C 運算子過載函式之成員運算子過載函式

5.2.3 成員運算子過載函式 在c 中可以把運算子過載函式定義為某個類的成員函式,稱之為成員運算子過載函式。1.定義成員運算子過載函式的語法形式 1 在類的內部,定義成員運算子過載函式的格式如下 函式型別 operator 運算子 形參表 2 成員運算子過載函式也可以在類中宣告成員函式的原型,在類...