友元

类是具有封装和隐藏性的,类中的私有成员一般来说只有类成员(函数、变量)才能访问。
就像家里的保险柜,只有家里的成员才能打开,如果想让家以外的人打开保险箱,就给外人一把钥匙(赋予他友元属性)。

友元一般有3种形式:
1.友元类
2.友元函数
3.友元类成员函数

这里,我们举个关系例子。
一个男孩boy,他有一个女朋友girlfriend,一个堂兄弟brother,他和她女朋友关系较好的同学classmate,还有个校友schoolfellow.
男孩和女朋友、同学关系很好,把他们定为友元类和友元函数;
男孩的女朋友和同学关系也好,也把他定为友元函数;
男孩和他堂兄弟关系比较好,就把堂兄弟的成员函数定为友元函数;
男孩和校友泛泛之交,不具备友元关系。
重点是这个男孩有100元钱,女孩有1000元钱,大家都找他们借钱。

友元关系的结论就是:
1.通过在类中声明友元类,友元类中的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息。
  (女朋友可以随意花男朋友钱用)
2.通过在类中声明友元函数,友元函数可以调用类的私有数据。
  (十年同窗,关系很好,也可以借男孩的钱用)
3.通过在类中声明友元类成员函数,只有友元类成员函数可以调用类的私有数据。
  (兄弟关系,也可以共享男孩部分钱用;由于经常借,必须限制他)
4.一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
  (同事既可以借男孩的钱用,又可以借男孩女朋友的钱用,大概是他牵的红线)
5.友元是单向的
  (女朋友随意花男孩的钱;男孩想用女朋友的钱,没门)
6.友元关系不具备传递性。
  (堂兄弟也休想借男孩女朋友的钱)
7.友元不能被继承
  (这个是后话,男孩和女朋友的娃娃也不能随便花家长的钱 )

注意:
友元函数不是类成员函数;友元虽好,却破坏了类的封装与隐藏。


简单源码如下:

#include<iostream.h>

class boy;
//堂兄弟
class brother
{
public:
  void share(boy &bb)
  {
    //这里编译不过,还没找出原因
    //bb.cash;
  }
};
//男孩
class boy
{
public:  
  void deposit()
  {
    cash = 100;  
  }
  friend class girlfriend; 
  friend void classmate();
  friend void brother::share(boy &bb);
private:
  int cash;
  //友元函数,友元类可以放在私有部分,也可以是共有部分。
  //friend class girlfriend;
  //friend void classmate();
  //friend void brother::share(boy &bb);
};
//女朋友
class girlfriend
{
public:
  void use()
  {
    boy bf;
    int take = bf.cash; 
	cout<<"girlfriend cost boy's cash: "<<take<<endl;
  }
  void deposit()
  {
    money = 1000;  
  }
  friend void classmate();
  private:
  int money;
};
//同学
void classmate()
{
  boy cb;
  cb.deposit();
  int borrow = cb.cash;
  cout<<"classmate borrow boy's cash: "<<borrow<<endl;
  
  girlfriend cg;
  cg.deposit();
  borrow = cg.money;
  cout<<"classmate borrow girl's money: "<<borrow<<endl;
}     
//校友
void schoolfellow()
{  
  boy sb;
  sb.deposit();
  //校友想借钱,编译不过
  //sb.cash;
}        

int main()
{	
  classmate();
		
  girlfriend gf;
  gf.use();
  return 1;
}


 

 

你可能感兴趣的:(友元)