9.4.2 友元的成员函数
当A类的成员函数作为B类的友元函数时,必须先定义A类,而不仅仅是声明它。成员形式的友元函数如代码9.5所示。
代码9.5 友元的成员函数MemberFriend
<——————————————-文件名:point.h————————————————> 01 #include<iostream> 02 using namespace std; 03 class point;//声明point类 04 class line//定义line类 05 { 06 public: 07 float dis(point&p1,point&p2);//友元函数的原型,作为line类的成员函数 08 }; 09 class point//定义point类 10 { 11 private: 12 int x,y;//private型数据成员x和y 13 friend float line:dis(point&p1,point&p2);//友元的声明 14 public: 15 point(int i=0,int j=0)//point类的构造函数,带默认参数 16 { 17 x=i; 18 y=j; 19 } 20 void disp()//成员函数disp,用来输出点的信息 21 { 22 cout<<"("<<x<<","<<y<<")"; 23 } 24 }; <———————————-文件名:example905.cpp———————————————-> 25 #include"point.h" 26 #include<cmath>//使用计算平方根的函数sqrt要用到的头文件 27 int main() 28 { 29 line line1;//声明一个line类的对象line1 30 point p1(1,2),p2(4,5);//声明两个point类的对象p1和p2 31 p1. disp();//输出点p1的信息 32 cout<<"与"; 33 p2. disp();//输出点p2的信息 34 cout<<"距离="<<line1.dis(p1,p2)<<endl;//调用line1的成员函数dis计算两点间的距离 35 return 0; 36 } 37 //line类内成员函数dis的实现,作为point类的友元函数 38 float line:dis(point&p1,point&p2) 39 { 40 float d; 41 d=sqrt((p1. x-p2.x)(p1.x-p2.x)+(p1.y-p2.y)(p1.y-p2.y)); 42 //可访问point类对象的private成员 43 return d; 44 }
输出结果如下所示。
(1,2)与(4,5)距离=4.24264
【代码解析】为了方便说明问题,line类仅仅包含一个成员函数dis,若要声明dis为point类的友元函数,必须使用“line:”指明dis是line类的成员函数,如代码第13行,结合代码9.5说明几点注意事项。
(1)友元函数所在的类必须先定义,即代码9.5中line类必须定义在point类前,对类实现的位置没有具体要求。
(2)根据前面“对象的生存期、作用域和可见域”一节的介绍可知,在line类的dis函数中需要传递对象参数,因此,必须在line类前对point类进行声明,且由于point类的定义在line类的定义后面,编译器无法决定dis函数中point对象的大小和成员组成,因此,只能对point对象采取传引用或传指针处理,而且,dis函数不能定义为内联格式,必须定义在point类定义之后。