運算子過載與友元

2021-08-31 11:57:29 字數 2239 閱讀 2804

參考:《c++primer plus》第六版

先給段**:

#include

#include

using

namespace std;

class

time

void

addmin

(int m)

void

addhr

(int h)

void

reset

(int h =0,

int m =0)

time sum

(const time &t)

const

void

display()

~time()

};intmain()

這段**用來計算兩個時間的加和,需要使用函式物件的方式進行呼叫並賦值。我們如果想要用加減號等進行時間的計算,這就引入了運算子過載的概念。c++允許將運算子過載到使用者定義的型別,例如,允許使用+將兩個物件相加。

做法:將上面**time類中的time sum(const time &t)const 這段宣告改為 time operator+(const time &t)const即可。

tips:

友元:什麼是友元:友元是一種定義在類外部的普通函式或類,但它需要在類體內進行說明,它不屬於成員函式,但是可以訪問類中的私有成員。

什麼時候使用友元進行運算子過載:多在過載二元運算子時使用(帶兩個引數的運算子)

示例:仍回到上面的**,如果進行如下運算,程式將會報錯:沒有與這些操作匹配的「+」運算子

tt =

3+ t2;

為什麼呢?不妨將這個式子轉化為另外一種形式:tt = 3.operator(t2)

這樣就很明了了!很顯然,3不是乙個time型的物件,因此無法使用time類的成員函式。

友元的引入

針對上面提出的問題,可能想到的一種解決措施是在外部新建立乙個非成員函式,它的宣告如下:

time operator+(

int n,

const time &t)

;

隨之而來的問題是,基於類的封裝性,外部非成員函式不能直接訪問類的私有資料。那麼該如何做呢?回顧上面關於友元的定義,我們發現可以使用友元來解決這個問題。

步驟:(1)類中的宣告:

friend time operator+(

int n,

const time &t)

;

類外的定義:

需要特別強調的是,因為友元函式不是成員函式,因此在外部的定義中無需加friend

time operator+(

int n,

const time &t)

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

這裡由於時間原因簡寫,等有時間補上。

對於count<&

operator

<<

(ostream &os,

const time &t)

//因為cout是ostream物件,故返回型別為ostream的引用

全部**:

#include

#include

using

namespace std;

class

time

void

addmin

(int m)

void

addhr

(int h)

void

reset

(int h =0,

int m =0)

/*time operator+(const time &t)const */

friend ostream &

operator

<<

(ostream &os,

const time &t)

;void

display()

~time()

};intmain()

ostream &

operator

<<

(ostream &os,

const time &t)

//因為cout是ostream物件,故返回型別為ostream的引用

友元運算子過載

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

運算子過載,友元函式

運算子過載 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 中提供的...