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;
}