1 #include <math.h> 2 #include<iostream> 3 using namespace std; 4 5 class Point 6 { 7 public: 8 Point(double xx, double yy) 9 { 10 x=xx; 11 y=yy; 12 } 13 void Getxy(); 14 friend double Distance(Point &a, Point &b); //类Point的友元函数 15 friend class You; //类Point的友元类 16 private: 17 double x, y; 18 }; 19 20 21 class You 22 { 23 public: 24 double Multi(Point &a) 25 { 26 return a.x * a.y + 1; 27 } 28 }; 32 void Point::Getxy() 33 { 34 cout<<"("<<x<<","<<y<<")"<<endl; 35 } 36 double Distance(Point &a, Point &b) //类Point的友元函数 37 { 38 double dx = a.x - b.x; 39 double dy = a.y - b.y; 40 return sqrt(dx*dx+dy*dy); 41 } 42 int main(void) 43 { 44 Point p1(3.0, 4.0), p2(6.0, 8.0); 45 p1.Getxy(); 46 p2.Getxy(); 47 double d = Distance(p1, p2); //Distance是类Point的友元函数,不是成员函数 48 cout<<"Distance is "<<d<<endl; 49 You you; 50 d = you.Multi(p1); 51 cout<<"Math.Multi is "<<d<<endl; 52 return true; 53 }
为什么会有友元函数?
结合着类的特性和类中一般成员函数,我们可以这样理解:类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有 成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该 看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但 它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的 作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样.