分享

c++学习笔记(七):友元函数和友元类

 雪柳花明 2016-11-15

友员用关键字friend声明。

友员是对类操作的一种辅助手段。

一个类的友员可以访问该类各种性质的成员。


一、友元函数

1、友员函数通过对象参数访问私有数据成员

2、成员函数通过this指针在对象上操作

友元函数 VS 成员函数:

  1. lass  A  
  2.    { private:  
  3.           int  i ;  
  4.           friend void FriendFun(A * , int) ;   
  5.       public:  
  6.          void MemberFun(int) ;  
  7.    } ;  
  8.       
  9. void FriendFun( A * ptr , int x  )   
  10.      {   
  11.         ptr -> i = x ;  
  12.          }   
  13. void A:: MemberFun( int x )   
  14.      {  
  15.          i = x ;  
  16.           }   
  17. void Test()  
  18. {  
  19.     FriendFun( &Aobj, 5 ) ;  
  20.     Aobj.MemberFun( 5 ) ;  
  21.   
  22.     }  

用友员函数计算两点之间的距离 :


  1. class Point  
  2. public:  
  3.       Point(double xi, double yi) { X = xi ; Y = yi ;}  
  4.       double GetX() { return X ; }  
  5.       double GetY() { return Y ; }  
  6.       friend double Distance ( Point & a, Point & b ) ;  
  7.   private:  double X, Y ;  
  8. } ;  
  9. double Distance(Point & a, Point & b )    
  10.   { double dx = a.X - b.X ;  
  11.      double dy = a.Y - b.Y ;  
  12.      return sqrt ( dx * dx + dy * dy ) ;  
  13.   }  
  14. void main()  
  15. { Point  p1( 3.0, 5.0 ) ,  p2( 4.0, 6.0 ) ;  
  16.   double  d = Distance ( p1, p2 ) ;  
  17.   cout << "This distance is " << d << endl ;  
  18. }   

二、友员类
1、若F类是A类的友员类,则F类的所有成员函数都是A类的友员函数
2、友员类通常设计为一种对数据操作或类之间传递消息的辅助类 


  1. class A  
  2. {   
  3.     friend class B ;//类 B 是类 A 的友员  
  4.   
  5.    public :  
  6.        void  Display() { cout << x << endl ; } ;  
  7.    private :  
  8.     int  x ;  
  9. } ;  
  10.   
  11. //B类没有数据成员仅提供对A类的操作  
  12. class  B  
  13. public :  
  14.        void Set ( int i ) { Aobject . x = i ; }  //通过类成员访问A类的私有数据成员  
  15.   
  16.        void Display ()  { Aobject . Display () ; } //通过类成员调用A类的成员函数  
  17.          
  18.        //通过对象参数访问友员的成员  
  19.   
  20.        void Set (A & Aobject , int i) { Aobject . x = i ; }   
  21.              void Display (A & Aobject ) { Aobject . Display() ; }   
  22.   
  23.   
  24.    private :  
  25.     A  Aobject ; //类 B 的 A 类数据成员  
  26.   
  27. } ;  
  28. void main()  
  29. { B  Bobject ;  
  30.    Bobject.Set ( 100 ) ;  
  31.    Bobject.Display () ;  
  32. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多