c 筆記 運算子過載和友元

2021-10-07 20:25:45 字數 1954 閱讀 3497

過載的作用機理

過載的區別:成員函式與非成員函式

友元運算子過載是一種形式的c++多型,過載的概念擴充套件到了運算子上,允許賦予c++運算子多種含義,允許將運算子過載擴充套件到使用者定義的型別。編譯器將根據運算元的數目和型別決定使用哪種加法定義。

過載的運算子(有些例外情況)不必是成員函式,但必須至少有乙個運算元是使用者定義的型別。

大多數運算子可以通過成員函式或者非成員函式進行過載

過載運算子時,將左側的運算元作為呼叫的物件。

過載分兩種情況:

理論上:a= b * 2.75 和 a= 2.75 * b是等價的,但是根據左側運算元是否是呼叫的物件,實現方式上是有很大的差別的。

如:a = b * 2.75

cls cls::

operator*(

const

double t)

;//成員函式

a = b*

2.75

;a = b.

operator

(2.75

);

如:a = 2.75 * b

不能使用成員函式過載運算子,因為左側運算元2.75不是呼叫的物件,因此編譯器不能使用成員函式去替換該表示式。

錯誤

a =

2.75

*b;a =

2.75

.operator

(b);

//error

正確

friend cls operator*(

const

double multi,

const cls &t)

;

非成員版本的過載運算子函式所需的形引數目與運算子使用的運算元數目相同;

成員版本 所需的引數數目少乙個,因為其中的乙個運算元是被隱式地傳遞的呼叫物件。

左側運算元不符合呼叫物件:使用非成員函式

左側運算元為呼叫物件: 使用成員函式

兩側都符合呼叫物件時:不能同時使用成員函式和非成員函式定義,編譯器會使兩者匹配同乙個表示式,導致二義性錯誤。

友元是c++介面的組成部分,通過讓函式成為友元,可以賦予該函式與類的成員函式相同的訪問許可權。

將原型宣告在類宣告中,並在原型宣告前加上關鍵字friend

編寫定義時不需要使用類作用域運算子,也不用再加friend關鍵字。

原型在類中宣告,但友元函式不是類的成員函式,不能使用成員運算子呼叫

友元和類的成員一樣具有相同的訪問許可權

翻轉運算元的順序

運算子的第乙個運算元並非類的物件,且要為類過載該運算子時使用。

如:a=b * 1.5;a = 1.5 * b;

cls cls::

operator*(

const cls &t)

;//實現a= b*1.5

friend cls operator*(

const

double multi,

const cls %t)

;//實現a = 1.5*b

過載《運算子的兩種案例

. ① cout

void

operator

<<

(std::ostream &os,

const cls &t); //cout<.>operator

<<

(std::ostream &os,

const cls &t)

;

友元和運算子過載

友元分為友元函式和友元類兩種 1.友元函式。乙個類的友元函式可以訪問該類的私有成員 2.友元類。若a是b的友元類,則a的成員函式可以訪問b的私有成員 運算子過載 就是對已有的運算子 c 中預定義的運算子 賦予多重的含義,使同一運算子作用於不同型別的資料時導致不同型別的行為 目的 擴充套件c 中提供的...

友元運算子過載

運算子就是一種特殊的函式 運算子過載可以是普通函式 const money operator const money a1,const money a2 可以是成員函式 const money operator const money a2 const 當二元運算子作為成員函式進行過載時,只有乙個引...

C 友元運算子過載函式

運算子過載函式 實現物件之間進行算數運算,實際上是物件的屬性之間做運算 包括 加號 減號 負號 正號 運算子過載函式分為 普通友元運算子過載函式 成員友元運算子過載函式 成員運算子過載函式 運算子運算子過載函式按運算型別為 雙目運算子過載函式,如加 減 乘 除 賦值 單目運算子過載函式 自加 自減 ...