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類的一切成員,包含公有。