C primer 第七章 類 友元(2)

2021-08-14 20:22:01 字數 1465 閱讀 1436

對於希望部分開放訪問許可權的類,友元是必須的

例如a類的private部分只讓b方法訪問並控制,而拒絕c方法的訪問

通常情況下我們可以把b寫成a類的成員函式

但是如果我們想要b函式成為乙個介面,即引數不僅限於乙個類物件,那麼我們想要特化的這個b函式,應當擁有多個類物件的訪問權,此時就需要用友元

友元可以是類,也可以是函式(成員函式或者全域性函式都可以)

class d;

class a

void cleara(a& a)

class d

這樣做的話,全域性函式cleara和class d的成員函式可以訪問並修改a類的所有成員變數和成員函式

乙個友元的宣告必須在類的內部,在函式前加一條friend開頭的關鍵字

但是這個友元宣告不應該是友元函式本體的宣告友元並不是類成員,其作用僅僅只是當某個函式試圖訪問類物件的時候的許可權校驗,這一切都是編譯器在記錄並控制訪問許可權(有的編譯器將不強制執行這個原則,而允許將友元宣告當做函式宣告,這樣就破壞了函式的命名空間的規則,但是我們最好還是按標準來)

在友元函式的函式本體宣告之前,呼叫該函式是非法

class a

//非法操作,f尚未宣告

void g();

void h();

}void g() //非法,f函式尚未宣告

void f(); //宣告f函式

void h() //合法,f函式已經宣告

void f() //定義f函式

一般來說,友元函式的函式本體宣告最好在類之前,但是有的編譯器也支援無需類外的函式宣告

對於一般函式或者整個類,友元的宣告比較簡單,但是如果某個類要將另乙個類的某個成員函式作為友元的話,會稍複雜

例如,我只希望b類的成員函式cleara作為a類的友元,那麼我需要

1.宣告a類

2.宣告b類,並宣告b類成員函式cleara(在此之前需要宣告a類的原因是cleara函式將包含a型別的引數,需要可見的宣告)

3.定義a類,並將b類的cleara函式宣告為友元函式(在此之前需要宣告b類的是因為友元宣告需要有外部宣告)

4.定義b類成員函式cleara(在此之前需要定義a類的原因是cleara包含了對a類物件的操作,而物件需要有定義)

class a; //宣告class a

class b

;class a //定義classa並將b類的cleara宣告友元

b::void cleara(a& a) //定義cleara對於物件a的操作

c primer 第七章 類

const更大的作用是可以修飾函式的引數,返回值,定義體。1.用const 修飾函式的引數 如果引數作輸出用,不論它是什麼資料型別,也不論它採用 指標傳遞 還是 引用傳遞 都不能加const修飾,否則該引數將失去輸出功能。const 只能修飾輸入引數 如果輸入引數採用 指標傳遞 那麼加const修飾...

C Primer 第七章 類

成員函式 宣告在類內,定義可內可外,定義在類內則是隱式內聯函式 在成員函式內部,可以直接使用呼叫該函式的物件的成員 類外部定義的成員的名字必須包含所屬類名 this本身是乙個常量指標,預設情況下指向非常量版本 在引數列表後加const可以修改this指向常量型別 編譯器首先編譯成員的宣告,然後才輪到...

C Primer 第七章 類

7.2 訪問控制與封裝 7.2.1 訪問說明符 7.2.2 友元 7.3 類的其他特性 7.4 類的作用域 7.5 建構函式高階 7.6 類的靜態成員 類的基本思想 封裝在成員函式內部,任何對類成員的直接訪問都被看做this的隱式掉用,也就是當我們使用成員變數bookno的時候,實際上隱式的使用了t...