C++ 中友元函數(shù)與友元類詳解
C++ 中友元函數(shù)與友元類詳解
總的來(lái)說(shuō),友元分為兩類:友元函數(shù)與友元類。友元是針對(duì)類而言,它提供了一種非類的成員函數(shù)來(lái)訪問(wèn)類的非公有成員的一種機(jī)制。可以把一個(gè)函數(shù)指定為某類的友元,這個(gè)函數(shù)稱為這個(gè)類的友元函數(shù)。也可以將類A指定為類B的友元,則類A是類B的友元類,類A的所有成員函數(shù)均是類B的友元函數(shù),均可以訪問(wèn)類B的非公有成員。
友元函數(shù)的注意事項(xiàng):
(1)友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問(wèn)對(duì)象的成員,必須用“對(duì)象名.對(duì)象成員"方式來(lái)訪問(wèn), 友元函數(shù)可以訪問(wèn)類中的所有成員(公有,私有,保護(hù)),而一般的函數(shù)只能訪問(wèn)類的公有成員。
(2)友元函數(shù)不受類中的訪問(wèn)權(quán)限關(guān)鍵字的限制,可以將它放在類的公有,私有,保護(hù)部分,結(jié)果均一樣。
(3)某類的友元函數(shù)的作用域并非該類作用域,如果該友元函數(shù)是另一類的成員函數(shù),則其作用域?yàn)榱硪活惖淖饔糜颍駝t與一般函數(shù)相同。
(4)友元函數(shù)破壞了面向?qū)ο笤O(shè)計(jì)的封裝特性。所以應(yīng)該盡量少用。
友元類
如果某類B的成員函數(shù)會(huì)頻繁地訪問(wèn)類A的數(shù)據(jù)成員,而類A的數(shù)據(jù)成員的private/protected限制造成了類B存取的麻煩,B只能通過(guò)A的Public的成員函數(shù)進(jìn)行間接存取。這種情況下可以將類B作為類A的友元類,即類A向類B提供私有和保護(hù)成員的訪問(wèn)權(quán)限,讓類B可以直接存取。
友元類中的所有成員函數(shù)均可以看作是另一類的友元函數(shù)。
友元類的聲明: friend chass 類名;
下面是友元函數(shù)的例子
友元函數(shù)可以在類中聲明,聲明時(shí)在函數(shù)前增加friend關(guān)鍵字,然后在類體外定義,也可以直接在類中聲明定義。這兩種方式均可。下面例子中采取的是類中聲明,類體外定義的方式。
class Point
{
friend double Distance(const Point &p1, const Point &p2); //類體中聲明
public:
Point(int x, int y):x_(x), y_(y)
{};
private:
int x_;
int y_;
};
//類體外定義友元函數(shù)
double Distance(const Point &p1, const Point &p2)
{
double dx = p1.x_ - p2.x_; //直接訪問(wèn)類的私有成員
double dy = p1.y_ - p2.y_;
return sqrt(dx*dx+dy*dy);
}
int main()
{
Point p1(3,4);
Point P2(6,8);
cout << Distance(p1,p2) << endl;
return 0;
}
下面是友元類的例子:
class Television //電視類
{
friend class TeleController;//友元類聲明
public:
Television(int volume, int chanel): volume_(volume), chanel_(chanel){}
private:
int volume_; //音量
int chanel_; //頻道
};
class TeleController //遙控器類
{
public: //類中的每個(gè)成員函數(shù)都是電視類的友元函數(shù),都可以訪問(wèn)電視類的私有數(shù)據(jù)成員
void VolumeUp(Television &tv)
{
tv.volume_ += 1; //音量加1
}
void VolumeDown(Television &tv)
{
tv.volume_ -= 1;
}
void ChanelUp(Television &tv)
{
tv.chanel_ += 1; //頻道加1
}
void ChanelDown(Television &tv)
{
tv.chanel_ -= 1; //頻道減1
}
};
int main()
{
Television tv(1,1);
TeleController tc;
tc.ChanelUp(tv);
return 0;
}
友元類需要注意以下幾點(diǎn):
(1)友元關(guān)系是單向的;
(2) 友元關(guān)系不能被傳遞: A是B的友元,B是C的友元,則A是C的友元,這種傳遞不成立
(3) 友元關(guān)系不能繼承: A是B的友元,A的派生類C也是B的友元,這是不成立的。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
C++ 多線程編程建議之 C++ 對(duì)多線程/并發(fā)的支持(下)
這篇文章主要介紹的是 C++ 多線程編程建議之 C++ 對(duì)多線程/并發(fā)的支持的相關(guān)資料,承接前文 現(xiàn)代 C++ 對(duì)多線程/并發(fā)的支持,接下來(lái)我們看看回發(fā)生什么吧2021-10-10
詳解C語(yǔ)言中fseek函數(shù)和ftell函數(shù)的使用方法
這篇文章主要介紹了C語(yǔ)言中fseek函數(shù)和ftell函數(shù)的使用方法,兩個(gè)函數(shù)分別用于設(shè)置和返回文件指針stream的位置,需要的朋友可以參考下2016-03-03
C++封裝遠(yuǎn)程注入類CreateRemoteThreadEx實(shí)例
這篇文章主要介紹了C++封裝遠(yuǎn)程注入類CreateRemoteThreadEx實(shí)例,詳細(xì)講述了注入DLL到指定的地址空間以及從指定的地址空間卸載DLL的方法,需要的朋友可以參考下2014-10-10
C++數(shù)據(jù)結(jié)構(gòu)之堆詳解
本文詳細(xì)講解了C++數(shù)據(jù)結(jié)構(gòu)之堆,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C語(yǔ)言實(shí)現(xiàn)信號(hào)槽的項(xiàng)目實(shí)踐
信號(hào)槽是觀察者模式的一種實(shí)現(xiàn),一個(gè)信號(hào)就是一個(gè)能夠被觀察的事件,本文主要介紹了C語(yǔ)言實(shí)現(xiàn)信號(hào)槽的項(xiàng)目實(shí)踐模具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
C語(yǔ)言實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
C/C++中for語(yǔ)句循環(huán)用法以及練習(xí)舉例
for語(yǔ)句是一種循環(huán)語(yǔ)句,它是對(duì)while語(yǔ)句的推廣,下面這篇文章主要給大家介紹了關(guān)于C/C++中for語(yǔ)句循環(huán)用法以及練習(xí)舉例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03

