程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++之友元:友元函數和友元類詳解

C++之友元:友元函數和友元類詳解

編輯:關於C++

C++之友元:友元函數和友元類詳解。本站提示廣大學習愛好者:(C++之友元:友元函數和友元類詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++之友元:友元函數和友元類詳解正文


1、友元引見
我們曉得,類的成員函數可以拜訪同類的其他成員函數,包含私有、公有和掩護成員。而類的內部函數只能拜訪類的私有成員。

友元是一種許可非類成員函數拜訪類的非私有成員的一種機制。
可以把一個函數指定為類的友元,也能夠把全部類指定為另外一個類的友元。

友元函數
友元類

2、友元函數
友元函數在類感化域外界說,但它須要在類體中停止解釋
為了與該類的成員函數加以差別,界說的方法是在類頂用症結字friend解釋該函數,格局以下:

friend  類型 友元函數名(參數表);
友元的感化在於進步法式的運轉效力

友元函數留意事項:
1、友元函數不是類的成員函數,在函數體中拜訪對象的成員,必需用對象名加運算符“.”加對象成員名。但友元函數可以拜訪類中的一切成員(私有的、公有的、掩護的),普通函數只能拜訪類中的私有成員。

2、友元函數不受類中的拜訪權限症結字限制,可以把它放在類的私有、公有、掩護部門,但成果一樣。

3、某類的友元函數的感化域並不是該類感化域。假如該友元函數是另外一類的成員函數,則其感化域為另外一類的感化域,不然與普通函數雷同。

4、友元函數損壞了面向對象法式設計類的封裝性,所以友元函數如不是必需應用,則盡量罕用。或許用其他手腕包管封裝性。

#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類的友元函數,可以拜訪類的公有數據成員。

3、友元類
假如某類B的成員函數會頻仍的存取另外一個類A的數據成員, 而A的數據成員的Private/Protectd限制作成B存取的費事, B只能經由過程A的Public的成員函數停止直接存取
把B做成A類的友元類,即A類向B類開放其Private/Protectd內容, 讓B直接存取
友元類:一個類可以作另外一個類的友元
友元類的一切成員函數都是另外一個類的友元函數
友元類的聲明:
friend class 類名;

友元類留意事項:
1、友元關系是單向的
2、友元關系不克不及被傳遞
3、友元關系不克不及被繼續

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 類的成員函數就都可以拜訪Television類的一切成員,包含公有。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved