c++ 友元 函数
我们都知道类中的私有成员,只有被类里的成员函数访问,在类外是不能访问的。这体现了C++中类设计的封装、隐蔽思想,是C++最基本的优点。
但如果偶尔有的时候,我们在类外又确实想访问这些私有成员,就会变得麻烦很多,就处于既访问不到又不能声明为public类型的两难处境。
而友元的出现就可以很好的解决这个问题,即把外部的函数声明为友元类型,赋予它可以访问类内私有成员的权利,来做到两全其美。这就是友元的意义,从字面意思也可以看出来,像“朋友”一样,开了一个绿色通道。
友元的对象,它可以是全局的一般函数,也可以是其他类里的成员函数,这种叫做友元函数。不仅如此,友元还可以是一个类,这种叫做友元类。
理解友元的意义和作用后,我们来看怎么在C++中使用。对于友元函数,只需要在类内对这个函数进行声明,并在之前加上friend关键字。这个函数就具有了独特的权限,成为友元函数。
最后需要注意的是,友元并不属于这个类本身,无论是友元函数还是友元类。都不能使用类内的this指针,同时也不可以被继承,如同父亲的朋友不一定是儿子的朋友这个道理。
下面,我们写一个求两点之间距离的程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#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类内的最后一行。此时代码编译无问题,正常输出
学习友元函数之后,我们再来看友元类,也是一样的道理和使用方法。如果把一个类A声明为另一个类B的友元类,则类A中的所有成员函数都可以访问B类中的成员,使用方法也一样,在类B中进行声明即可。
还是上一节的程序功能,我们稍作更改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#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; } int distancetoLine() { } friend class Tool; }; class Tool { public : double GetX(Point &A) { cout<<A.x<<endl; return A.x; } double GetY(Point &A) { cout<<A.y<<endl; return A.y; } double dis(Point &A) { cout<< sqrt (A.x*A.x+A.y*A.y)<<endl; return sqrt (A.x*A.x+A.y*A.y); } }; int main() { Point A(2.0,3.0); Tool T; T.GetX(A); T.GetY(A); T.dis(A); return 0; } |
可以看到我们又定义了一个工具类,可以获取一个点类的横、纵坐标以及求出这个点距离原点的距离,由三个方法实现,封装到一个类Tool里。并且在Point类里进行友元类的声明,可以看到使用方法。
最后我们总结友元机制的优缺点总结如下:
优点:更方便快捷的访问类内的私有成员。
缺点:打破了C++中的封装思想。
大家合理使用友元!
参考:
https://www.dotcpp.com/course/72
https://www.dotcpp.com/course/71
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!