天天看點

C/C++ 友元

友元的作用是提高了程式的運作效率,但是他破壞了類的封裝性和隐蔽性。

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

1.友元函數

//普通函數轉化為友元函數  
           
<span style="font-family: Arial, Helvetica, sans-serif;">#include <iostream></span>
           
#include <math.h>
class Coord
{
private:
	int x;
	int y;
public:
	friend double dis(Coord & t,Coord&q);     //友元函數的申明可以放在類的任何位置    

};

//普通函數
double dis(Coord & t,Coord&q)
{
	double  xx = t.x - q.x;
	double  yy = t.y - q.y;

	return (sqrt(xx*xx + yy*yy));
}


int main()
{
	using namespace std;
	Coord a, b;
	double c = dis(a, b);
	cout << c << endl;

	system("pause");
	return 0;

}
           
//類成員函數轉化為友元函數 
           
<span style="font-family: Arial, Helvetica, sans-serif;">#include <iostream></span>
           
#include <math.h>

           
/*  前向申明,是一種不完全型聲明 ,即隻需提供類名(無需提供實作),功能也很有限  */
           
/*  1.不能定義類的對象  2.可用于定義這個類型的引用或者指針  3.用于聲明使用該類型,作為形參或者函數的傳回類型。*/
           
<span style="font-family: Arial, Helvetica, sans-serif;">class Coord; // 前向聲明  因為接下來 Coordmanagement類中 用到了 Coord的引用  </span>
           
class Coordmanagement與class Coord 位置不可以互換   應為在 class中 用到了 Coordmanagement ::  前向申明的功能有限 .
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">class Coordmanagement</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">{public:</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">   double dis(Coord & t, Coord&q);</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;"> };</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">class Coord</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">{</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">  private:</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">    double x;double y;</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">  public:</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">    Coord(double a, double b)</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">      {x = a;y = b;}</span>
           
<span style="color: rgb(51, 204, 0); font-size: 18px;">    friend double Coordmanagement :: dis(Coord & t, Coord&q); //友元函數的申明可以放在類的任何位置 };</span>
           
<span style="font-family: Arial, Helvetica, sans-serif;">//類成員函數  </span>
           
double Coordmanagement:: dis(Coord & t, Coord&q)
{
	double  xx = t.x - q.y;
	double  yy = t.y - q.y;

	return (sqrt(xx*xx + yy*yy));
}

int main()
{
	using namespace std;
	Coord a(1,2), b(1,2);
	Coordmanagement d;
	double c = d.dis(a,b);
	cout << c << endl;

	system("pause");
	return 0;

}</span>
           

2.友元類

#include <iostream>
#include <math.h>

class Coord
{
private:
	double x;
	double y;
public:
	Coord(double a, double b)
	{
		x = a;
		y = b;
	}
	friend class Coordmanagement;   //友元類的申明  整個 class Coordmanagement  都是 class Coord 友元類

};

class Coordmanagement
{
public:
	double dis(Coord & t, Coord&q);
};


double Coordmanagement:: dis(Coord & t, Coord&q)
{
	double  xx = t.x - q.y;
	double  yy = t.y - q.y;

	return (sqrt(xx*xx + yy*yy));
}

int main()
{
	using namespace std;
	Coord a(1,2), b(1,2);
	Coordmanagement d;
	double c = d.dis(a,b);
	cout << c << endl;

	system("pause");
	return 0;

}
           

注意事項 :

1. 友元關系不能被繼承;

2.友元關系是單向的,不具有交換性;

3.友元關系不具備轉遞性;A是B的友元,B是C的友元,A不一定是C的友元;

以上代碼用VS2013編譯可通過   

如有錯誤 還望指出     謝謝  !