C++_友元函數(shù)1、為什么要引入友元函數(shù):在實(shí)現(xiàn)類之間數(shù)據(jù)共享時(shí),減少系統(tǒng)開銷,提高效率
具體來說:為了使其他類的成員函數(shù)直接訪問該類的私有變量 即:允許外面的類或函數(shù)去訪問類的私有變量和保護(hù)變量,從而使兩個(gè)類共享同一函數(shù) 優(yōu)點(diǎn):能夠提高效率,表達(dá)簡單、清晰 缺點(diǎn):友元函數(shù)破環(huán)了封裝機(jī)制,盡量不使用成員函數(shù),除非不得已的情況下才使用友元函數(shù)。 2、什么時(shí)候使用友元函數(shù): 1)運(yùn)算符重載的某些場合需要使用友元。 2)兩個(gè)類要共享數(shù)據(jù)的時(shí)候 3、怎么使用友元函數(shù): 友元函數(shù)的參數(shù): 因?yàn)橛言瘮?shù)沒有this指針,則參數(shù)要有三種情況: 1、 要訪問非static成員時(shí),需要對象做參數(shù);--常用(友元函數(shù)常含有參數(shù)) 2、 要訪問static成員或全局變量時(shí),則不需要對象做參數(shù) 3、 如果做參數(shù)的對象是全局對象,則不需要對象做參數(shù) 友元函數(shù)的位置: 因?yàn)橛言瘮?shù)是類外的函數(shù),所以它的聲明可以放在類的私有段或公有段且沒有區(qū)別。 友元函數(shù)的調(diào)用: 可以直接調(diào)用友元函數(shù),不需要通過對象或指針 友元函數(shù)的分類: 根據(jù)這個(gè)函數(shù)的來源不同,可以分為三種方法: 1、普通函數(shù)友元函數(shù): a) 目的:使普通函數(shù)能夠訪問類的友元 b) 語法:聲明位置:公有私有均可,常寫為公有 聲明: friend + 普通函數(shù)聲明 實(shí)現(xiàn)位置:可以在類外或類中 實(shí)現(xiàn)代碼:與普通函數(shù)相同(不加不用friend和類::) 調(diào)用:類似普通函數(shù),直接調(diào)用 c) 代碼:
2、類Y的所有成員函數(shù)都為類X友元函數(shù)—友元類 a)目的:使用單個(gè)聲明使Y類的所有函數(shù)成為類X的友元 它提供一種類之間合作的一種方式,使類Y的對象可以具有類X和類Y的功能 具體來說: 前提:A是B的友元(=》A中成員函數(shù)可以訪問B中有所有成員,包括私有成員和公有成員--老忘) 則:在A中,借助類B,可以直接使用~B . 私有變量~的形式訪問私有變量 b)語法:聲明位置:公有私有均可,常寫為私有(把類看成一個(gè)變量) 聲明: friend + 類名---不是對象啊 調(diào)用: c)代碼:
3、類Y的一個(gè)成員函數(shù)為類X的友元函數(shù) a)目的:使類Y的一個(gè)成員函數(shù)成為類X的友元 具體而言:而在類Y的這個(gè)成員函數(shù)中,借助參數(shù)X,可以直接以X。私有變量的形式訪問私有變量 b)語法:聲明位置:聲明在公有中 (本身為函數(shù)) 聲明:friend + 成員函數(shù)的聲明 調(diào)用:先定義Y的對象y---使用y調(diào)用自己的成員函數(shù)---自己的成員函數(shù)中使用了友元機(jī)制 c)代碼:
4、在模板類中使用友元operator<<(對<<運(yùn)算符的重載) a)使用方法: 在模板類中聲明:
在模板類中定義:
b)注意: 把函數(shù)聲明非模板函數(shù):
把函數(shù)聲明為模板函數(shù):
或:
說明:
5、友元函數(shù)和類的成員函數(shù)的區(qū)別:成員函數(shù)有this指針,而友元函數(shù)沒有this指針。 6、記憶:A是B的友元《=》A是B的朋友《=》借助B的對象,在A中可以直接 通過B。成員變量(可以是公有,也可以為私有變量) 的方式訪問B |
|