C++友元关系五连问,你能回答几个?

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

1️⃣前言

本章知识点:

  • 什么是友元?
  • 友元有什么特点?
  • 为什么有友元这个概念?
  • 友元的分类有哪些?
  • 如何创建和使用友元?

2️⃣回答

✨什么是友元?

  • 友元是一种定义在类外部的普通函数或类
  • 它需要在类体内进行说明
  • 为了与该类的成员函数区别开,我们会在说明时前面加以关键字friend
  • 简单的说,友元就是一种关系
  • 一种类与函数或者类与类之间的关系

✨友元有什么特点?

  • 友元可以访问类中的私有成员。 (类似:朋友是值得信任的,可以对朋友公开一些自己的隐私。)
  • 友元关系无法被继承 (类似:你爸爸的朋友不一定是你的朋友)
  • 友元关系是单向的(类似:类A是类B的朋友,但B不一定是A的朋友)
  • 友元关系无法传递(类似:即B是A的友元,C是B的友元,但是C不一定是A的友元。)

✨为什么有友元这个概念?

  • 我们知道,类具有封装性,即数据隐藏性。
  • 只有类的成员函数,才能访问类的私有成员。
  • 源文件中的其他函数是无法访问私有成员的。
  • 那么一般我们会设置一些公共接口来对外开放。
  • 即非成员函数可以访问类中的公有成员。
  • 但有时候,类的访问权限在某些应用场合会显得有些呆板。
  • 如果将数据成员都定义为公有的,这又破坏了隐藏的特性。
  • 所以就有了友元的概念
  • 友元被授予从外部访问类的私有部分的权限(即对某些类外的函数“开后门”)
  • 这也提高了类公有接口的灵活性。
  • 但是需要注意,友元破坏了类的整体操作性,也破坏了类的封装性。
  • 所以我们要有选择的使用友元

✨友元的分类有哪些?

分类:

  1. 友元类
  2. 友元函数

友元关系可以是一个函数,该函数被称为友元函数。

友元也可以是一个类,该类被称为友元类。


✨如何创建和使用友元?

关键字:frend

我们需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend

下面着重看看友元类以及友元函数

3️⃣友元类

首先我们定义一个类:

image.png

这个myBuilding类就相当于我的家,现在定义另一个类,是我的朋友

并且我的朋友想访问我家的客厅和卧室

image.png

  • 很显然,不可访问!

  • 这是因为,在myBuilding这个类中,我的卧室是一个私有的,外部无法访问。

  • 但是如果我们在myBuilding类中声明myFriend这个类是友元关系的,即friend class myFriend;

  • 那么此时myFriend这个类就是一个友元类,它可以访问类似私有成员。

所以完整代码如下:

image.png

运行结果为:

朋友在访问:我的客厅
朋友在访问:我的卧室
复制代码

4️⃣友元函数

一旦我们将一个类声明为另一个类的友元,就意味着这个类的所有成员函数都是另一个类的友元函数,即都可以访问另一个类中私有成员或保护成员。

但有时候我们并不想让类的所有成员都能访问另一个类的私有成员,那么此时我们可以将类的部分成员函数声明为友元函数,这样就只有友元函数可以访问另一个类的私有成员, 而不是整个类都能访问另一个类的私有成员。

因此总结的说,友元函数就是能够访问另一个类的私有成员的一个函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。

比如在myBuilding这个类中,我们声明了visit1是一个友元函数,因此visit1可以访问myBuilding的私有成员m_BedRoom

image.png

而在myFriend类中,visit2是访问不了myBuilding中的私有成员

image.png

所以在主函数中是这样的:

image.png

5️⃣写在最后

好了,看完本篇文章,相信你已经理解了友元关系,欢迎到评论区一起讨论吧!

猜你喜欢

转载自juejin.im/post/7086993951529369614