C++学习笔记(二十四):友元五连问,你答对几个吗?

前言
作者简介:大家好,我是翼同学
个人主页:翼同学的CSDN博客
系列专栏:【C++学习笔记】更新中…
备注:如果文章有误,请指正,万分感谢!让我们一起学习,一起进步。
✅最后:如果文章对您有帮助,请三连支持一下博主哦。

目录

  • 1️⃣前言
  • 2️⃣回答
    • 什么是友元?
    • 友元有什么特点?
    • 为什么有友元这个概念?
    • 友元的分类有哪些?
    • 如何创建和使用友元?
  • 3️⃣友元类
  • 4️⃣友元函数
  • 5️⃣写在最后


1️⃣前言

本章知识点:

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

2️⃣回答

什么是友元?

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

友元有什么特点?

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

为什么有友元这个概念?

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

友元的分类有哪些?

分类:

  1. 友元类
  2. 友元函数

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

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


如何创建和使用友元?

关键字:frend

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

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

3️⃣友元类

首先我们定义一个类:

C++学习笔记(二十四):友元五连问,你答对几个吗?_第1张图片

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

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

C++学习笔记(二十四):友元五连问,你答对几个吗?_第2张图片

  • 很显然,不可访问!

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

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

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

所以完整代码如下:

C++学习笔记(二十四):友元五连问,你答对几个吗?_第3张图片

运行结果为:

朋友在访问:我的客厅
朋友在访问:我的卧室

4️⃣友元函数

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

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

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

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

C++学习笔记(二十四):友元五连问,你答对几个吗?_第4张图片

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

C++学习笔记(二十四):友元五连问,你答对几个吗?_第5张图片

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

C++学习笔记(二十四):友元五连问,你答对几个吗?_第6张图片

5️⃣写在最后

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

你可能感兴趣的:(【C++学习笔记】,学习,后端,c++)