C++友元(Friends)总结

来源:互联网 发布:艹女人是什么感受 知乎 编辑:程序博客网 时间:2024/06/05 16:44


一、何为友元(friends)?
超脱类的访问控制,具有访问类中一切数据成员的能力是成员函数的特征,但成员函数以对象为自我中心,必须要捆绑一个对象才能调用。友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。
 
二、友元解决的问题和应用
       (1)解决频繁调用,提高访问性能
       非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。这是有的人可能会想出另一种方法,即通过非成员函数调用类内成员函数,从而简介访问私有数据,但对其频繁的访问会造成频繁的调用成员函数,于是导致调用开销明显增多,影响了性能。
2)运算符重载
将运算符重载为友元函数或成员函数,可以实现简单的多态,友元这种机制,方便了运算符的重载。(更多可参照运算符重载的知识)
3)给予不同对象间的亲密无间性
在接下来的第一个友元函数的例子中,也可以稍微改动,即同一个函数可以同时声明为多个类的友元,因此增加了类之间的联系,用一个简单的代码说明一下
friend vector multiply(const Matrix &m, const Vector &v);
/*multiply同时是Matrix类和Vector类的友元函数*/
 在第二个和第三个例子中,也增加了Student类和Teacher类两个类间的联系。
 
三、友元的形式
(1)友元函数
         友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。
Code:
  1. class Point   
  2. {   
  3.  public:   
  4.   Point(double xx, double yy) { x=xx; y=yy; }   
  5. friend double Distance(Point &a, Point &b);//Distance为类Point的友元函数  
  6.   private:   
  7.     double x, y;   
  8. };   
  9.     
  10. double Distance(Point &a, Point &b)   
  11. {   
  12.   double dx = a.x - b.x;   
  13.   double dy = a.y - b.y;   
  14.   return sqrt(dx*dx+dy*dy);   
  15. }   
  16.   
 
2)成员函数可以是另一个类的友元
       ,教师应该可以修改学生的成绩,可以访问学生类的私有数据,故将教师类种的成绩assignGrade成员函数声明为学生类的友元。
class Student;//在Teacher中用到了Student类,使用student必须先声明,这种手法成为向前声明。
Code:
  1. class Teacher   
  2. {   
  3.  private:   
  4.     Student *pList;   
  5.  public:   
  6.     // ...   
  7.     void assignGrade(Student &s);   
  8.  };//-----------------------------------   
  9.  class Student   
  10.  {   
  11.     private:   
  12.       Teacher *pT;   
  13.       int somesterHours;   
  14.       double grade;   
  15.     public:   
  16.       // ...   
  17.       friend void Teacher::assignGrade(Student &s);/*在学生类中把教师类种的成绩assignGrade成员函数声明为学生类的友元。*/  
  18.     
  19. };//------------------------------------  
 
3)友元类
即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。
Code:
  1. class Student;//在Teacher中用到了Student类,使用student必须先声明,这种手法成为向前声明。  
  2. class Teacher   
  3. {   
  4.  private:   
  5.     Student *pList;   
  6.  public:   
  7.     // ...   
  8.     void assignGrade(Student &s);   
  9.     void adjustHours(Student &s);   
  10.  };//-----------------------------------   
  11.  class Student   
  12.  {   
  13.     private:   
  14.       Teacher *pT;   
  15.       int somesterHours;   
  16.       double grade;   
  17.     public:   
  18.       // ...   
  19.       friend class Teacher;//在学生类种把教师类声明为友元类  
  20. };//------------------------------------   
 
四、褒贬友元
友元机制存在面向对象编程的争议,仿佛编程世界严密性的外在尊严,也强迫着编程内容的内在尊严:不同类型的对象之间也不应该有任何情面可言。好在C++法无定法,关于性能、效率的细节它从来没有忽略过。
原创粉丝点击