类的友元

喜夏-厌秋 提交于 2020-02-02 05:20:56

一、介绍

属性变量是private类型,在类的外部是不能直接用 对象.属性 的方式访问的。

友元关系:一个类主动声明自己的朋友类、朋友函数,特许他们访问本类的数据。于是,在友元函数中可以直接用对象.属性的方式访问。它适用于外界同时需要多个对象的私有属性,比如,求两点间距,而两点各为一个对象。

static静态变量是同一个类的多个对象共享属于类而不属于任何对象的一个公共变量,要区分开,详情见https://blog.csdn.net/floracuu/article/details/78106274

(实际上在类的外部写一个函数,接收形参为对象,在类中用一个成员函数将所需的属性值return出来即可。不过关于友元的讨论是基于想要直接用对象.属性的方式讨论的,所以以下的分析暂时忽略这种方式。这样看来,友元似乎不是必不可少的,希望自己可以早日真香,再来补充)

例:class Point { } ; 是一个二维坐标点的类,求两点间距,两个点各为一个对象,若求长度的函数写在类中,只能拿到本对象的坐标值,而不能拿到另一个点的值。写在外面,则两个点的坐标值都拿不到。所以要将计算距离的函数写在类的外面并且声明此函数为Point类的友元函数。

二、语法格式

   1. 友元函数:可以是普通函数,也可以是其他类的成员函数

声明,定义的方法是没有变化的,正常方式写就好,只是需要在“主人类”中声明一下,该函数是主人的朋友。

如:普通函数 int test(int a) { } 是类A的朋友,class A { public:friend int test (int a) ;}

       类B的成员函数 int test(int a) { } 是类A的朋友,friend int B::test(int a);

2. 友元类

也是没有变化,如:类B是类A的朋友,class A {public:friend class B};

B中的所有函数都成了A的友元

三、说明

1. 非传递性---朋友的朋友不是我的朋友:B是A的朋友,C是B的朋友,C不是A的朋友

2. 非继承性---朋友的孩子不是我的朋友:B是A的朋友,C是B的继承类,C不是A的朋友

3. 单向性:B是A的朋友,但A不是B的朋友

4. 前向引用:在class B中需要用到class A中数据,在class A中又需要声明朋友,不论谁写在前面都会因为对方尚未定义而出错,因此先前向引用B,再定义A并声明朋友,最后在B中访问A中数据。

class B;

class A { 略 };

class B { 略 };

5. UML画法:主人指向朋友

                                 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!