天生舞男

我喜欢谦虚的学习各种...,希望自己能坚持一辈子,因为即使一张卫生巾也是有它的作用.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

友元

Posted on 2005-09-12 17:54  天生舞男  阅读(485)  评论(0编辑  收藏  举报

1.友元是一种定义在类外部的普通函数,但它需要在类体内进行说明。
2.为了与该类的成员函数加以区别,在说明时前面加以关键字friend。
3.友元不是成员函数,但是它可以访问类中的私有成员。
4.友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,
   使得非成员函数可以访问类的私有成员。
下面是示例代码,复制粘贴到你的编译器即可调试
# include <math.h>
# include <iostream.h>
class Point
{
 public:
  Point(double xx,double yy)
  {
   x = xx;
   y = yy;
  }
  
  friend double Distance(Point & a,Point & b);
 private:
  double x;
  double y;
};

//不需要double Point::Distance(Point & a,Point & b),因为它不是类的成员函数。
double Distance(Point & a,Point & b)
{
 //a.x代表可以访问类的私有成员,实际上如果它不是在友元函数,类的实例(即对象)是不
 //能访问该类的私有成员,Point oPoint; oPoint.a是错误的。只有成员函数才能访问私有成员。
 //所以只要你把之前的friend去了,那么譬如a.x都是会报“a 是不可访问的”的错。
 double dx = a.x - b.x; 
 double dy = a.y - b.y;
 return sqrt(dx*dx + dy*dy);
}

void main()
{
 Point p1(3.0,4.0);
 Point p2(6.0,8.0);
 //invoke也是直接invoke,不需要用什么对象。
 double d = Distance(p1,p2);
 cout<<"Distance is "<<d<<endl;
}