一般來說,類內的私有資料是對外不可見的,但在有些情況下,我們需要在類外對該類的私有資料進行訪問,這就需要用到一種新技術——友元
(friend),即在宣告前新增關鍵字friend
。
友元關係是單向的,即如果a是b的友元,但b不一定是a的友元;
友元關係無傳遞性,即如果a是b的友元,b是c的友元,但a不一定是c的友元。
友元函式是指某些非類成員函式,但可以訪問類內的私有資料。
#include
using
namespace
std;
class a
friend
void show( const a& t ); //新增friend定義友元函式
};
/* 友元函式在類外宣告時不加friend */
void show( const a& t )
int main(void)
/*執行結果:
data = 1
*/
友元類是指若需要在類b中直接訪問類a的私有資料,因此將b作為a的友元(在a中宣告friend class b;
)。
友元類中的成員函式、私有資料都可以在另乙個類中被使用(即類b中可以直接使用類a的私有資料等)
class tv ;
tv( int s = off ) : state(s) {}
void onoff()
};class remote
};
友元成員函式是指類中的乙個成員函式被定義為友元函式。
與友元類不同的是,只有友元成員函式可以在另乙個中被使用,其餘函式都不可以。
#include
using
namespace
std;
class b; //前向宣告
class a
void print( b & b );
};/* 示例位置1 */
class b
void print()
friend
void a::print( b & b ); //友元成員函式
};/* 被定義為友元成員函式的函式必須在類外(另乙個使用該函式的類後面)定義 */
void a::print( b & b )
int main()
/*輸出結果:
b = 6
*/
需要注意的是:
(1)類的前向宣告。由於在a中的print函式需要使用b,如果不進行b的前向宣告,編譯器就不知道b是乙個類,會報錯。
(2)類的排列順序。在類b中會用到a的方法print(),因此需要先定義a,再定義b。
(3)友元成員函式的定義位置。友元成員函式不能使用內聯**,類中只能有函式宣告。函式定義需要放到類之後,在類外進行定義,而且必須放到另乙個類定義的後面。(對上面**來說,若將a::print()的定義放在類b定義之前——示例位置1處,也會報錯,提示類b未完成)
對於友元的位置在何處生明,可以簡單記為friend在哪,哪個就可以被外面直接訪問。(friend在類a,a就可以被其他特定位置訪問)
友元函式 友元類 友元成員函式
注意友元成員函式定義的3個步驟 include include include using namespace std class a class c class a class b void c display const a a 3.最後定義display,此時才可以使用a的私有成員 void ...
友元函式 友元類 友元成員函式
有些情況下,允許非成員函式訪問類中的私有成員,但又阻止一般的訪問,這種情況,就需要用到友元。使用friend宣告友元,友元的定義只能在類的內部 有些情況下,全域性函式需要訪問類中的私有成員,這種函式叫友元函式 如 客人可以訪問客廳,但一般客人不可以去主人臥室,關係較好的朋友才能訪問私有的臥室,這時就...
友元函式,友元類,友元成員函式
一 友元函式 class a1private int i void k a1 a 上面這段 當中,由於函式k想訪問類a1的成員變數i,但是由於i是private屬性,所以編譯不能通過。解決辦法 class a1friend void k a1 a private int i void k a1 a ...