C++之友元:友元函數(shù)和友元類詳解
一、友元介紹
我們知道,類的成員函數(shù)可以訪問同類的其他成員函數(shù),包括公有、私有和保護(hù)成員。而類的外部函數(shù)只能訪問類的公有成員。
友元是一種允許非類成員函數(shù)訪問類的非公有成員的一種機(jī)制。
可以把一個函數(shù)指定為類的友元,也可以把整個類指定為另一個類的友元。
友元函數(shù)
友元類
二、友元函數(shù)
友元函數(shù)在類作用域外定義,但它需要在類體中進(jìn)行說明
為了與該類的成員函數(shù)加以區(qū)別,定義的方式是在類中用關(guān)鍵字friend說明該函數(shù),格式如下:
friend 類型 友元函數(shù)名(參數(shù)表);
友元的作用在于提高程序的運(yùn)行效率
友元函數(shù)注意事項:
1、友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問對象的成員,必須用對象名加運(yùn)算符“.”加對象成員名。但友元函數(shù)可以訪問類中的所有成員(公有的、私有的、保護(hù)的),一般函數(shù)只能訪問類中的公有成員。
2、友元函數(shù)不受類中的訪問權(quán)限關(guān)鍵字限制,可以把它放在類的公有、私有、保護(hù)部分,但結(jié)果一樣。
3、某類的友元函數(shù)的作用域并非該類作用域。如果該友元函數(shù)是另一類的成員函數(shù),則其作用域為另一類的作用域,否則與一般函數(shù)相同。
4、友元函數(shù)破壞了面向?qū)ο蟪绦蛟O(shè)計類的封裝性,所以友元函數(shù)如不是必須使用,則盡可能少用?;蛘哂闷渌侄伪WC封裝性。
#include <math.h>
#include <iostream>
using namespace std;
class Point
{
friend double Distance(const Point &p1, const Point &p2);
public:
Point(int x, int y);
private:
int x_;
int y_;
};
Point::Point(int x, int y) : x_(x), y_(y)
{
}
double Distance(const Point &p1, const Point &p2)
{
double dx = p1.x_ - p2.x_;
double dy = p1.y_ - p2.y_;
return sqrt(dx * dx + dy * dy);
}
int main(void)
{
Point p1(3, 4);
Point p2(6, 9);
cout << Distance(p1, p2) << endl;
return 0;
}
程序中Distance 是Point類的友元函數(shù),可以訪問類的私有數(shù)據(jù)成員。
三、友元類
如果某類B的成員函數(shù)會頻繁的存取另一個類A的數(shù)據(jù)成員, 而A的數(shù)據(jù)成員的Private/Protectd限制造成B存取的麻煩, B只能通過A的Public的成員函數(shù)進(jìn)行間接存取
把B做成A類的友元類,即A類向B類開放其Private/Protectd內(nèi)容, 讓B直接存取
友元類:一個類可以作另一個類的友元
友元類的所有成員函數(shù)都是另一個類的友元函數(shù)
友元類的聲明:
friend class 類名;
友元類注意事項:
1、友元關(guān)系是單向的
2、友元關(guān)系不能被傳遞
3、友元關(guān)系不能被繼承
TeleController.h :
#ifndef _TELE_CONTROLLER_H_
#define _TELE_CONTROLLER_H_
class Television;
class TeleController
{
public:
void VolumeUp(Television &tv);
void VolumeDown(Television &tv);
void ChanelUp(Television &tv);
void ChanelDown(Television &tv);
};
#endif // _TELE_CONTROLLER_H_
TeleController.cpp :
#include "TeleController.h"
#include "Television.h"
void TeleController::VolumeUp(Television &tv)
{
tv.volume_ += 1;
}
void TeleController::VolumeDown(Television &tv)
{
tv.volume_ -= 1;
}
void TeleController::ChanelUp(Television &tv)
{
tv.chanel_ += 1;
}
void TeleController::ChanelDown(Television &tv)
{
tv.volume_ -= 1;
}
Television.h:
#ifndef _TELEVISION_H_
#define _TELEVISION_H_
class TeleController;
class Television
{
friend class TeleController;
public:
Television(int volume, int chanel);
private:
int volume_;
int chanel_;
};
#endif // _TELEVISION_H_
Television.cpp:
#include "Television.h"
Television::Television(int volume, int chanel) : volume_(volume), chanel_(chanel)
{
}
main.cpp:
#include "Television.h"
#include "TeleController.h"
#include <iostream>
using namespace std;
int main(void)
{
Television tv(1, 1);
TeleController tc;
tc.VolumeUp(tv);
return 0;
}
將TeleController 類作為Television類的友元類,這樣TeleController 類的成員函數(shù)就都可以訪問Television類的所有成員,包括私有。
上一篇:C++ 在堆上開辟與釋放二維、三維指針詳細(xì)解析
欄 目:C語言
下一篇:CFile與CStdioFile的文件讀寫使用方法詳解
本文標(biāo)題:C++之友元:友元函數(shù)和友元類詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4153.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載