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

c++友元函數與友元類的深刻解析

編輯:關於C++

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


友元函數和友元類的須要:
類具有封裝和信息隱蔽的特征。只要類的成員函數能力拜訪類的公有成員,法式中的其他函數是沒法拜訪公有成員的。非成員函數可以拜訪類中的私有成員,然則假如將數據成員都界說為私有的,這又損壞了隱蔽的特征。別的,應當看到在某些情形下,特殊是在對某些成員函數屢次挪用時,因為參數傳遞,類型檢討和平安性檢討等都須要時光開支,而影響法式的運轉效力。

為懂得決上述成績,提出一種應用友元的計劃。友元是一種界說在類內部的通俗函數,但它須要在類體內停止解釋,為了與該類的成員函數加以差別,在解釋時後面加以症結字friend。友元不是成員函數,然則它可以拜訪類中的公有成員。友元的感化在於進步法式的運轉效力,然則,它損壞了類的封裝性和隱蔽性,使得非成員函數可以拜訪類的公有成員。
友元可所以一個函數,該函數被稱為友元函數;友元也能夠是一個類,該類被稱為友元類。

友元函數
友元函數的特色是可以或許拜訪類中的公有成員的非成員函數。友元函數從語法上看,它與通俗函數一樣,即在界說上和挪用上與通俗函數一樣。上面舉一例子解釋友元函數的運用。

#include "iostream"
#include "cmath"
using namespace std;
class Point
{
private:
 double x,y;
public:
 Point(double xx, double yy) { x=xx; y=yy; }
 void Getxy();
 friend double Distance(Point &a, Point &b);  //friend標識它是友元函數,而不是成員函數,
};
void Point::Getxy()
{
 cout<<"("<<x<<","<<y<<")"<<endl;
}
double Distance(Point &a, Point &b)
{
 double dx = a.x - b.x;  //可以拜訪類中的公有成員
 double dy = a.y - b.y;
 return sqrt(dx*dx+dy*dy);
}
int main(void)
{
 Point p1(3.0, 4.0), p2(6.0, 8.0);
 p1.Getxy();    //挪用成員函數
 p2.Getxy();
 double d = Distance(p1, p2);  //挪用友元函數時,也是同通俗函數的挪用一樣,不要像成員函數那樣挪用
 cout<<"The distance is "<<d<<endl;
 system("pause");
 return 0;
}

解釋:在該法式中的Point類中解釋了一個友元函數Distance(),它在解釋時前邊加friend症結字,標識它不是成員函數,而是友元函數。它的界說辦法與通俗函數界說一樣,而分歧於成員函數的界說,由於它不須要指出所屬的類。然則,它可以援用類中的公有成員,函數體中 a.x,b.x,a.y,b.y都是類的公有成員,它們是經由過程對象援用的。在挪用友元函數時,也是同通俗函數的挪用一樣,不要像成員函數那樣挪用。本例中,p1.Getxy()和p2.Getxy()這是成員函數的挪用,要用對象來表現。而Distance(p1, p2)是友元函數的挪用,它直接挪用,不須要對象表現,它的參數是對象。

友元類
友元除後面講過的函數之外,友元還可所以類,即一個類可以作另外一個類的友元。當一個類作為另外一個類的友元時,這就意味著這個類的一切成員函數都是另外一個類的友元函數。
應用友元類時留意:
(1) 友元關系不克不及被繼續。
(2) 友元關系是單向的,不具有交流性。若類B是類A的友元,類A紛歧定是類B的友元,要看在類中能否有響應的聲明。
(3) 友元關系不具有傳遞性。若類B是類A的友元,類C是B的友元,類C紛歧定是類A的友元,異樣要看類中能否有響應的聲名
C中聲明A是其友元類,那末最根本的就是A可使用C中的private辦法或許對象。
可見,A是B的基類,C是D的基類。ABCD中就有以下關系:
1.B新增的辦法不克不及拜訪C的公有成員
2.B從A繼續而來的辦法可以拜訪C的公有成員
3.A只能拜訪D中從C中繼續而來的公有成員,D中新增的公有成員不克不及拜訪!

總結起來:
(1)友元關系弗成以繼續,但對已有的辦法來講拜訪權限不轉變。
(2)假如改寫基類的辦法則拜訪權限轉變
(3)友元關系不具有傳遞性
若類B是類A的友元,類C是B的友元,類C紛歧定是類A的友元

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