運算子過載和友元函式

2022-08-23 09:57:10 字數 1591 閱讀 2051

1. 運算子過載

c++允許將運算子過載擴充套件到使用者定義的型別,例如:允許使用+將兩個物件相加,編譯器將根據運算元的數目和型別決定使用哪種加法定義,過載運算子可以使**看起來更加自然。

例:計算時間,乙個運算子過載的例項:

class

time

time(

int hours, int

minutes)

void sethours(int

hours)

intgethours()

void setminutes(int

minutes)

intgetminutes()

time

operator+(const time& t) const

time

operator*(double mult) const

};

測試:

2. 友元函式

運算子過載中,下面的語句

a = b * 3.5

將被轉成下面的成員函式呼叫

a = b.operator*(3.5)

但是下面的語句又會如何呢

a = 3.5 * b;  // cannot correspond to a member function

解決這個問題的一種方式是,告訴每個人,只能按照b * 3.5這種格式編寫,這是一種對伺服器友好-客戶警惕的解決方案,與oop無關

還有一種方式:非成員函式,非成員函式不是由物件呼叫的,它使用的所有值都是顯式引數,這樣編譯器能夠將下面的表示式

a = 3.5 * b

與非成員函式匹配

a = operator*(3.5, b);

該函式的原型如下:

time operator*(double m, const time& t);對於非成員過載運算子函式而言,運算子左邊的運算元等於操作符函式的第乙個引數,運算子表示式右邊的運算元對應於運算子函式的第二個引數。

使用非成員函式可以按照所需的順序獲得運算元,但是引發了乙個新的問題,非成員函式不能直接訪問類的私有資料,至少常規非成員函式不能訪問,然而有一類特殊的非成員函式可以訪問類的私有成員,被稱為友元函式

建立友元函式的額第一步是將函式原型放在類的宣告中,並在原型的宣告前加上關鍵字friend

friend time operator*(double m, const time& t);

該原型意味著兩點:

1. 雖然operator*()函式都是在類宣告中宣告的,但是不是成員函式,因此不能使用成員運算子來呼叫;

2. 雖然operator*()函式不是成員函式,但是它與成員函式的訪問許可權相同

第二步是編寫函式的定義,因為它不是成員函式,所以不需要使用time::限定符

常見的友元:過載《運算子

友元函式和運算子過載

友元函式 class a void myprint 友元函式的實現,在友元函式中可以訪問私有的屬性 void modify i a p,int a void main 友元類 class a void myprint class b private a a 運算子過載 class point voi...

運算子過載,友元函式

運算子過載 include using namespace std class cint cint const cint timp public cint operator const cint timp const cint add const cint timp const cint add c...

友元和運算子過載

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