1. 程式人生 > >c++ 友元friend簡單理解

c++ 友元friend簡單理解

C++中的友元機制允許類的非公有成員(private成員)被一個類或者函式訪問,友元按型別分為三種:普通非類成員函式作為友元,類的成員函式作為友元,類作為友元。 友元包括友元的宣告以及友元的定義。友元的宣告預設為了extern,就是說友元類或者友元函式的作用域已經擴充套件到了包含該類定義的作用域,所以即便我們在類的內部定義友元函式也是沒有關係的。 友元可以是一個函式,該函式被稱為友元函式;友元也可以是一個類,該類被稱為友元類。友元函式的特點是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣。 友元函式的實現可以在類外定義,但必須在類內部宣告

友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類, 但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend。

1.普通的非成員函式友元

#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)是友元函式的呼叫,它直接呼叫,不需要物件表示,它的引數是物件。(該程式的功能是已知兩點座標,求出兩點的距離。)