国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++之友元:友元函數(shù)和友元類詳解

2020-01-26 15:53:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、友元介紹
我們知道,類的成員函數(shù)可以訪問(wèn)同類的其他成員函數(shù),包括公有、私有和保護(hù)成員。而類的外部函數(shù)只能訪問(wèn)類的公有成員。

友元是一種允許非類成員函數(shù)訪問(wèn)類的非公有成員的一種機(jī)制。
可以把一個(gè)函數(shù)指定為類的友元,也可以把整個(gè)類指定為另一個(gè)類的友元。

友元函數(shù)
友元類

二、友元函數(shù)
友元函數(shù)在類作用域外定義,但它需要在類體中進(jìn)行說(shuō)明
為了與該類的成員函數(shù)加以區(qū)別,定義的方式是在類中用關(guān)鍵字friend說(shuō)明該函數(shù),格式如下:

friend  類型 友元函數(shù)名(參數(shù)表);
友元的作用在于提高程序的運(yùn)行效率

友元函數(shù)注意事項(xiàng):
1、
友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問(wèn)對(duì)象的成員,必須用對(duì)象名加運(yùn)算符“.”加對(duì)象成員名。但友元函數(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ì)類的封裝性,所以友元函數(shù)如不是必須使用,則盡可能少用。或者用其他手段保證封裝性。

復(fù)制代碼 代碼如下:

#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ù),可以訪問(wèn)類的私有數(shù)據(jù)成員。

三、友元類
如果某類B的成員函數(shù)會(huì)頻繁的存取另一個(gè)類A的數(shù)據(jù)成員, 而A的數(shù)據(jù)成員的Private/Protectd限制造成B存取的麻煩, B只能通過(guò)A的Public的成員函數(shù)進(jìn)行間接存取
把B做成A類的友元類,即A類向B類開放其Private/Protectd內(nèi)容, 讓B直接存取
友元類:一個(gè)類可以作另一個(gè)類的友元
友元類的所有成員函數(shù)都是另一個(gè)類的友元函數(shù)
友元類的聲明:
friend class 類名;

友元類注意事項(xiàng):
1、友元關(guān)系是單向的
2、友元關(guān)系不能被傳遞
3、友元關(guān)系不能被繼承

TeleController.h :

復(fù)制代碼 代碼如下:

#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 :
復(fù)制代碼 代碼如下:

#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:
復(fù)制代碼 代碼如下:

#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:
復(fù)制代碼 代碼如下:

#include "Television.h"
Television::Television(int volume, int chanel) : volume_(volume), chanel_(chanel)
{
}

main.cpp:
復(fù)制代碼 代碼如下:

#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ù)就都可以訪問(wèn)Television類的所有成員,包括私有。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 望奎县| 永胜县| 兴山县| 河曲县| 元谋县| 始兴县| 微山县| 化隆| 根河市| 周宁县| 遂川县| 彭水| 昌图县| 石城县| 咸丰县| 屏南县| 光泽县| 三门峡市| 营口市| 花莲市| 平利县| 苍溪县| 卢氏县| 望奎县| 平原县| 张掖市| 颍上县| 宿州市| 雅安市| 平乐县| 西贡区| 宜丰县| 辽宁省| 景谷| 孙吴县| 杨浦区| 肇东市| 浪卡子县| 凌源市| 凉城县| 海林市|