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