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

C++中的friend友元函數具體解析

編輯:關於C++

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


友元函數是可以直接拜訪類的公有成員的非成員函數。它是界說在類外的通俗函數,它不屬於任何類,但須要在類的界說中加以聲明,聲明時只需在友元的稱號前加上症結字friend。

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

為懂得決上述成績,提出一種應用友元的計劃。友元是一種界說在類內部的通俗函數,但它須要在類體內停止解釋,為了與該類的成員函數加以差別,在解釋時後面加以症結字friend。友元不是成員函數,然則它可以拜訪類中的公有成員。友元的感化在於進步法式的運轉效力(即削減了類型檢討和平安性檢討等都須要的時光開支),然則,它損壞了類的封裝性和隱蔽性,使得非成員函數可以拜訪類的公有成員。

友元可所以一個函數,該函數被稱為友元函數;友元也能夠是一個類,該類被稱為友元類。

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

#include "cmath"
#include "iostream"
using namespace std;
class Point
{
public:
      Point(double xx,double yy)
      {
          x=xx;
          y=yy;
      }
      void GetXY();
      friend double Distance(Point &a,Point &b);
protected:
private:
      double x,y;
};
void Point::GetXY()
{
     //cout<<"("<<this->x<<","<<this->y<<")"<<endl;
     cout<<"("<<x<<","<<y<<")"<<endl;
}
double Distance(Point &a,Point &b)
{
     double length;
     length=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));     //它可以援用類中的公有成員
     return length;
}
int main(void)
{
     Point p1(3.0,4.0),p2(6.0,8.0);
     p1.GetXY();    //成員函數的挪用辦法,經由過程應用對象來挪用
     p2.GetXY();
     double d = Distance(p1,p2);     //友元函數的挪用辦法,同通俗函數的挪用一樣,不要像成員函數那樣挪用
     cout<<d<<endl;
     system("pause");
     return 0;
}

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

上面對下面的代碼停止輸出、輸入流的重載:

#include <cmath>
#include <iostream>
using namespace std;
class Point
{
public:
      Point(double xx,double yy)
      {
           x=xx;
           y=yy;
      }
      void GetXY();
      friend double Distance(Point &a,Point &b);
     friend ostream &operator <<(ostream &a,Point &b);
protected:
private:
      double x,y;
};
// friend ostream& operator<<(ostream& o,A& another);
ostream &operator <<(ostream &out,Point &b)   //在類中聲明的時刻,可所以ostream &a,函數界說的時刻也能夠是ostream &out
{
     out<<"("<<b.x<<","<<b.y<<")"<<endl;
     return out;
}
void Point::GetXY()
{
     //cout<<"("<<this->x<<","<<this->y<<")"<<endl;
     //cout<<"("<<x<<","<<y<<")"<<endl;
     cout<<*this;
}
double Distance(Point &a,Point &b)
{
     double length;
     length=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
     return length;
}
int main(void)
{
     Point p1(3.0,4.0),p2(6.0,8.0);
     p1.GetXY();
     p2.GetXY();
     double d = Distance(p1,p2);
     cout<<d<<endl;
     system("pause");
     return 0;

}

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