最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年09月12日 09:26:12   作者:  
友元是一種允許非類成員函數(shù)訪問類的非公有成員的一種機制??梢园岩粋€函數(shù)指定為類的友元,也可以把整個類指定為另一個類的友元

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

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

友元函數(shù)
友元類

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

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

友元函數(shù)注意事項:
1、
友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問對象的成員,必須用對象名加運算符“.”加對象成員名。但友元函數(shù)可以訪問類中的所有成員(公有的、私有的、保護的),一般函數(shù)只能訪問類中的公有成員。

2、友元函數(shù)不受類中的訪問權(quán)限關(guān)鍵字限制,可以把它放在類的公有、私有、保護部分,但結(jié)果一樣。

3、某類的友元函數(shù)的作用域并非該類作用域。如果該友元函數(shù)是另一類的成員函數(shù),則其作用域為另一類的作用域,否則與一般函數(shù)相同。

4、友元函數(shù)破壞了面向?qū)ο蟪绦蛟O(shè)計類的封裝性,所以友元函數(shù)如不是必須使用,則盡可能少用?;蛘哂闷渌侄伪WC封裝性。

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

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

友元類注意事項:
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ù)就都可以訪問Television類的所有成員,包括私有。

相關(guān)文章

  • C++實現(xiàn)LeetCode(89.格雷碼)

    C++實現(xiàn)LeetCode(89.格雷碼)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(89.格雷碼),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中的typedef、#define、const特點和用法介紹

    C語言中的typedef、#define、const特點和用法介紹

    在C 語言中,typedef、#define和const都用于定義常量和簡化代碼,但它們的用途和工作方式有顯著區(qū)別,下面詳細(xì)講解這三者的特點和用法,感興趣的朋友一起看看吧
    2024-08-08
  • C語言實現(xiàn)桌面貪吃蛇小游戲

    C語言實現(xiàn)桌面貪吃蛇小游戲

    這篇文章主要介紹了C語言實現(xiàn)桌面貪吃蛇小游戲,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 使用C++實現(xiàn)給PDF文檔添加文字水印

    使用C++實現(xiàn)給PDF文檔添加文字水印

    這篇文章主要為大家詳細(xì)介紹了如何通過第三方國產(chǎn)庫Spire.PDF?for?C++來實現(xiàn)給PDF文檔添加文字水印,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • C語言連續(xù)生成多個隨機數(shù)實現(xiàn)可限制范圍

    C語言連續(xù)生成多個隨機數(shù)實現(xiàn)可限制范圍

    這篇文章主要介紹了C語言連續(xù)生成多個隨機數(shù)實現(xiàn)可限制范圍,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 利用Matlab一鍵生成工地海報特效

    利用Matlab一鍵生成工地海報特效

    這篇文章主要介紹了如何利用Matlab制作出工地海報的特效,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • C++實現(xiàn)學(xué)生成績管理系統(tǒng)最新版

    C++實現(xiàn)學(xué)生成績管理系統(tǒng)最新版

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)學(xué)生成績管理系統(tǒng)最新版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ std::bind用法詳解

    C++ std::bind用法詳解

    這篇文章主要介紹了C++ std::bind用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 深入了解C語言棧的創(chuàng)建

    深入了解C語言棧的創(chuàng)建

    棧只允許在一端進行插入或刪除操作的線性表。首先棧是一種線性表,但是限定這種線性表只能在某一端進行插入和刪除操作,這篇文章主要介紹了C語言對棧的實現(xiàn)基本操作
    2021-07-07
  • 利用C語言來求最大連續(xù)子序列乘積的方法

    利用C語言來求最大連續(xù)子序列乘積的方法

    這篇文章主要介紹了利用C語言來求最大連續(xù)子序列乘積的方法,基本的思路以外文中還附有相關(guān)ACM題目,需要的朋友可以參考下
    2015-08-08

最新評論

新郑市| 玉门市| 刚察县| 紫云| 临沭县| 海口市| 上饶市| 武功县| 依兰县| 高安市| 灵山县| 濮阳市| 浮梁县| 大城县| 北川| 马龙县| 蒲城县| 那曲县| 黔南| 增城市| 通化市| 且末县| 五河县| 六枝特区| 嘉定区| 墨竹工卡县| 永平县| 淮安市| 德阳市| 吐鲁番市| 沙坪坝区| 宽甸| 丽水市| 长丰县| 嘉兴市| 宝兴县| 甘孜| 新巴尔虎左旗| 深泽县| 辛集市| 来安县|