本例对C++友元的使用从代码上作了一个简单的归纳,但不仅限于本问讲到的用法,友元还可以重载等。
**

/全局函数作为友元/

**

include <iostream>

include <cmath>

using namespace std;

class Point{
public:

Point(double x, double y){    _x = x;    _y = y;}void getFormatxy();friend double distance(Point &a, Point &b);

private:

double _x, _y;

};

void Point::getFormatxy(){

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()
{

Point p1(3.0, 4.0), p2(6.0, 8.0);p1.getFormatxy();p2.getFormatxy();double d = distance(p1, p2);cout<<"distance is "<<d<<endl;return 0;

}

**

/一个类的成员函数作友元/

**

include <iostream>

include <cmath>

using namespace std;

class Point; //前向声明,用于声明。

class ManagerPoint{
public:

double distance(Point &a, Point &b);

};

class Point{
public:

Point(double x, double y){    _x = x;    _y = y;}void getFormatxy();friend double ManagerPoint::distance(Point &a, Point &b);

private:

double _x, _y;

};

void Point::getFormatxy(){

cout<<"("<<_x<<","<<_y<<")"<<endl;

}

double ManagerPoint::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()
{

Point p1(3.0, 4.0), p2(6.0, 8.0);p1.getFormatxy();p2.getFormatxy();ManagerPoint mp;float d = mp.distance(p1, p2);cout<<"distance is"<<d<<endl;return 0;

}

**

/友元类/

**

include <iostream>

include <cmath>

using namespace std;

class Point{
public:

friend class ManagerPoint;Point(double x, double y){    _x = x;    _y = y;}void getFormatxy();

private:

double _x, _y;

};

void Point::getFormatxy(){

cout<<"("<<_x<<","<<_y<<")"<<endl;

}

class ManagerPoint{
public:

double distance(Point &a, Point &b);

};

double ManagerPoint::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()
{

Point p1(3.0, 4.0), p2(6.0, 8.0);p1.getFormatxy();p2.getFormatxy();ManagerPoint mp;float d = mp.distance(p1, p2);cout<<"distance is"<< d<<endl;return 0;

}

**

/友元小结/

**
//友元声明以关键字friend开始,它只能出现在类定义中
//因为友元不是类授权的成员,所以它不受其所在区域的public private 和protected 的影响
//通常,把所有友元声明组织在一起并放在类头之后.
//友元利弊:
//友元不是类成员,但是它可以通过对象访问类中的私有成员,友元的作用在于提高程序的运行效率
//但是,它破坏了封装性,使得非成员函数可以访问类的私有成员
//注意: 友元关系不能被继承,友元关系不具有传递性

include <iostream>

using namespace std;

class Time{
public:

friend class Watch;Time(int hour, int min, int sec){    m_iHour = hour;    m_iMinute = min;    m_iSecond = sec;}

private:

int m_iHour;int m_iMinute;int m_iSecond;

};

class Watch{
public:

Watch(Time t): m_tTime(t){}void display(){    cout<<m_tTime.m_iHour<<endl;    cout<<m_tTime.m_iMinute<<endl;    cout<<m_tTime.m_iSecond<<endl;}

public:

Time m_tTime;

};

int main()
{

Time t(6, 30, 20);Watch w(t);w.display();return 0;

}