C++小知识——友元函数和友元类

学习算法时用到了C++语言,遇到了友元函数,曾经学习过但是影响不太深刻,所以今天重新学习记录一下对友元函数的理解和如何使用。

1.什么是友元函数

友元函数是C++中的一种特殊的函数,基本概念相信大家已经很清楚了:

类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

 

2.为什么要使用到友元函数

在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员,那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。

概括来说一般有两种情况要使用到友元函数:

(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。

3.友元函数的形式

friend <函数类型> <函数名> (<参数列表>)

看一段代码:

class INTEGER

 {

  friend void Print(const INTEGER& obj);//声明友元函数

 };

void Print(const INTEGER& obj)

{

   //函数体

}

void main()

{

  INTEGER obj;

  Print(obj);//直接调用

}

大概就是这种形式。

4.友元类的形式

和友元函数类似,例如创建了类A和类B,如果B是友元函数的话,即类B中可以直接访问类A中的私有变量,只需要在A类中声明即可,看如下代码:

class boy

{

public:

  void disp(girl &);

};

void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数

{

  cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量

}

class girl

{

private:

  char *name;

  int age;

  friend boy; //声明类boy是类girl的友元

};

5.友元函数需要注意的点 

  1. 类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,不需要加类限定。
  2. 一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。
  3. 友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用。
  4. 友元函数在调用上同一般函数一样,不必通过对对象进行引用。
  5. 一些操作符的重载实现也是要在类外实现的,那么通常这样的话,声明为类的友元是必须的,比如你要自定义算法的时候,对“<<”的重载,就必须声明友元函数。
  6.   友元函数和类的成员函数的区别

    1.成员函数有this指针,而友元函数没有this指针。

    2.友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友

 

6.缺点

友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值