【摘要】:类中指定的访问权限对友元函数是无效的,因此把友元函数说明放在类的私有部分、公有部分、保护部分效果都一样。友元函数可定义在类外,也可在类内。程序的执行结果如下:n=324使用友元函数计算两点间的距离。
1.友元函数的声明
为了使一个函数成为类的友元函数,必须在类中进行声明。声明友元函数的方式是在类中用关键词friend声明该函数,其一般格式如下:
friend函数类型友元函数名(参数表);
友元函数说明的位置可在类的任何地方,既可在public区,也可在protected区,意义完全一样。友元函数的定义既可以放在类的外部,也可以放在类的内部,一般与类的成员函数定义放在一起。例如,以下类的声明中指明add是友元函数:
友元函数具有以下特点:
◇友元函数可以是一个普通的函数,也可以是其他类的成员函数,但它一定不是本类的成员函数。
◇一般成员函数只可以访问一个类的私有和保护的成员,但友元函数可以访问多个类的私有和保护的成员。
◇友元函数可以绕过成员函数,直接访问类的私有和保护的成员,这样就避免了调用成员函数相关的开销。
◇如果没有友元功能,一个函数要想访问某个类的私有和保护的成员时,只能是将这个成员设置为公共的,这样一来用户就可以访问该类中的所有成员,从而破坏了信息的隐藏性。
使用友元函数,应注意以下几点:
(1)友元函数并不是类的成员函数,它不带有this指针。所以必须用对象名或对象的引用作为友元函数的形参,并在函数体内使用运算符“.”来访问对象的成员。
(2)类中指定的访问权限对友元函数是无效的,因此把友元函数说明放在类的私有部分、公有部分、保护部分效果都一样。友元函数可定义在类外,也可在类内(称为内联定义)。
(3)慎用友元函数。类的一个重要特性是封装性,而友元函数破坏了类的封装性,因此除了实现一些特殊的运算符函数重载之外,尽量避免使用友元函数。
(4)一个类的友元函数不能被该类的派生类继承,派生类需要重新定义自己的友元。
【例3.9】分析以下程序的执行结果。
解:上述程序中,类MyClass7中定义了一个友元函数square,在main()函数,语句“b=square(a);”像普通函数一样调用该友元函数。程序的执行结果如下:
n=324
【例3.10】使用友元函数计算两点间的距离。
解:设计一个点类Point,它有两个私有数据成员x和y,表示点的坐标。设计计算两点间距离的函数Dist,这个函数需要访问Point类的私有数据成员x和y,所有将Dist声明为Point类的友元函数。
对应的程序如下:
本程序的执行结果如下:
The distance is:5
【例3.11】设计一个学生类Stud,包括学生姓名、成绩,其中设计一个友元函数输出成绩对应的等级:
≥90:优;
80~89:良;
70~79:中;
60~69:及格;
<60:不及格。
解:设计一个学生类Stud,其中的trans()函数设计成友元函数,其功能是将成绩转换成相应的等级。本题程序如下:(www.chuimin.cn)
本程序执行结果如下:
输出结果
王小华,78,中
李大明,92,优
张中伟,62,及格
孙强,88,良
2.操作多个对象成员的友元函数
如果一个函数需要操作多个不同类对象的成员,而且这些成员都是这些对象的非公有成员,则可以采用两种设计方式:
(1)将这个函数声明为这些类的友元。例如:
(2)将该函数声明为一个类的成员函数,并声明它为其他类的友元。例如:
【例3.12】分析以下程序的执行结果。
解:fun函数作为类Front和类Behind的友元函数,可以访问它们的私有数据成员。程序执行结果如下:
90
【例3.13】分析以下程序的执行结果。
解:fun函数作为类Front的友元函数,同时又是类Behind的成员函数,所以需要通过类Behind对象来访问它。程序执行结果如下:
72
从上述两个例子看到,它们的功能是相同的,分别采用了(1)和(2)两种方式,从比较可以看出,第(1)种方式更好些,因为fun函数的形参必须包含所有类对象(假设需要操作所有这些类对象),而再通过某个对象调用这个函数(如behind.fun(front,behind)),似乎有些多余。
3.返回类对象的友元函数
友元函数的返回值可以是某个类的对象,其声明的一般格式如下:
friend类名友元函数名(形参列表);
这样需要在该函数中创建返回的类对象。创建返回的类对象有两种方式:
(1)建立一个临时对象,并通过计算产生对应的数据成员值,然后用return返回这个临时对象。
(2)通过return语句返回“类名(实参)”来返回类对象,在此之前先要计算出“实参”的值。
【例3.14】分析以下程序的执行结果。
解:类MyClass8中有两个友元函数,其中sub函数是采用方式(1)实现的,add函数是采用方式(2)实现的。程序的执行结果如下:
c.m=10
d.m=30
相关推荐