我们都知道类中的私有成员,只有被类里的成员函数访问,在类外是不能访问的。这体现了C++中类设计的封装隐蔽思想,是C++最基本的优点。


但如果偶尔有的时候,我们在类外又确实想访问这些私有成员,就会变得麻烦很多,就处于既访问不到又不能声明为public类型的两难处境。


而友元的出现就可以很好的解决这个问题,即把外部的函数声明为友元类型,赋予它可以访问类内私有成员的权利,来做到两全其美。这就是友元的意义,从字面意思也可以看出来,像“朋友”一样,开了一个绿色通道。


友元的对象,它可以是全局的一般函数,也可以是其他类里的成员函数,这种叫做友元函数。不仅如此,友元还可以是一个类,这种叫做友元类


理解友元的意义和作用后,我们来看怎么在C++中使用。对于友元函数,只需要在类内对这个函数进行声明,并在之前加上friend关键字。这个函数就具有了独特的权限,成为友元函数。


最后需要注意的是,友元并不属于这个类本身,无论是友元函数还是友元类。都不能使用类内的this指针,同时也不可以被继承,如同父亲的朋友不一定是儿子的朋友这个道理。


下面,我们写一个求两点之间距离的程序:

#include<iostream>
#include<math.h>
using namespace std;
class Point
{
    private:
        double x;
        double y;
    public:
        Point(double a,double b)
        {
            x = a;
            y = b;
        }
        int GetPoint()
        {
            cout<<"("<<x<<","<<y<<")";
            return 0;
        }
        friend double Distance(Point &a,Point &b);
};
//求两点之间的距离
double Distance(Point &a,Point &b)
{
    double xx;
    double yy;
    xx = a.x-b.x;
    yy = a.y-b.y;
 
    return sqrt(xx*xx+yy*yy);
}
int main()
{
    Point A(2.0,3.0);
    Point B(1.0,2.0);
    double dis;
    dis = Distance(A,B);
    cout<<dis<<endl;
    return 0;
}


大家可以观察实现求两点之间距离的函数为外部的一般函数,由于需要访问类内的私有成员,所以我们把它在类内声明成frined友元类型,见Point类内的最后一行。此时代码编译无问题,正常输出:

C++友元函数


可以看到测试结果,大家可以上机自行实验,分别尝试不声明为friend类型,观察报错结果。


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)