类和对象【六】友元和内部类

文章目录

  • 友元
    • 友元的作用
    • 友元的缺点
    • 友元函数
      • 语法:
      • 特点:
    • 友元类
      • 语法:
      • 特点:
  • 内部类
    • 概念
    • 特点

友元

友元的作用

友元提供了一种打破封装的方式,有时提供了便利。

友元的主要作用就是打破封装

即可以让一个类的友元函数/友元类可以直接访问和修改这个类的私有(private)和被保护(protected)成员


友元的缺点

  1. 安全性降低:友元可以不受限制地访问类的所有成员,这可能导致数据的不安全暴露。
  2. 封装性受损:尽管友元不是类的成员,但它的存在使得类的封装性受到破坏,因为非友元函数或类无法直接访问某类中的私有成员和被保护成员。

在实际编程中,应谨慎使用友元机制,避免因为封装性的破坏安全性的降低而导致程序的不稳定和难以维护。

友元应当只在没有其他更好的解决方案时才被考虑使用。


友元函数

语法:

在类中的任何一个访问限定符下增加一句声明:
friend(关键字) 全局的函数声明

即可让这个全局函数成为该类的友元函数

在这里插入图片描述
在这里插入图片描述

特点:

  1. 友元函数可访问类的私有和保护成员,但不是类的成员函数

  2. 友元函数不能用const修饰,因为const修饰函数的时候修饰的是this指针,只有类的成员函数才有this指针

  3. 友元函数的调用与普通函数的调用原理相同

  4. 一个函数可以是多个类的友元函数


友元类

如果类B是类A的友元类,那就可以在类B的作用域中【类B的成员函数的作用域也是类B的作用域】直接访问类A的成员

在这里插入图片描述
在这里插入图片描述


语法:

在类中的任何一个访问限定符下增加一句声明:
friend(关键字) 友元类的声明


特点:

  1. 友元关系是单向的,不具有交换性
    比如上面的事例中类B是类A的友元类,B就可以访问A中的私有和保护成员,但是A却不能访问B中的私有和保护成员,因为B并没有声明A是B的友元类【突然有点可悲是怎么回事?即A把B当做朋友,为B掏心掏肺,但B可能认为A什么都不是】
    在这里插入图片描述

  2. 友元关系不能继承【这个可以形象的理解为爸爸的朋友并不一定是儿子的朋友】

  3. 友元关系不能传递【我朋友的朋友也不一定是我的朋友】
    例:类C是类B的友元类,类B是类A的友元类,但类C不是类A的友元类


内部类

概念

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。

类比一下:
普通类是在命名空间域/全局域中定义的,但是普通类还是有一个自己的独立的类域,在类域之外的统一为外部,外部不可直接访问类中的私有和保护成员

内部类就是在另一个类的作用域中的定义的,所以内部类的类域之外的也统一是外部


特点

  1. 内部类是定义在一个类的类域里面的,而访问类域里面的东西必须指定类域【和命名空间类似】
    所以要在外部类之外使用内部类时,要用外部类+::先找到内部类
    在这里插入图片描述

  2. 内部类在外部类的类域里,在类域里的东西都受访问限定符的限制,内部类也不例外
    在这里插入图片描述

  3. 内部类是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员【包括私有和被保护成员】,但是外部类不是内部类的友元
    在这里插入图片描述

  4. 内部类可以直接访问外部类中的static成员不需要外部类的对象/类名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫100个Python例子优化

今天看到一个Python 100例的在线资源,感觉每个都需要去点,太费时间了,于是,使用Python将数据爬取下来,方便查看。实际效果如下: 。。。。。。 用了13分钟,当然,这是优化后的效果,如果没有优化,需要的时间更长。 爬取url如下: https://www.runoob.com/python/pytho…

Vue小程序项目知识积累(三)

1.CSS中的var( ) var() 函数用于插入自定义属性(也称为CSS变量)的值。 var(--main-bg-color,20rpx) 设置一个CSS变量的值,但是如果 --main-bg-color 变量不存在,它将默认返回 20rpx。 CSS变量必须在一个有效的CSS规则&#xf…

uniapp+vue3+ts开发小程序或者app架构时候的UI框架选型

使用vue3tsviteuniapp开发小程序或者跨平台app的趋势越来越高,有一个顺手的UI的框架还是非常重要的,官方维护的 uni-ui,支持全端,而且有类型提示,目前已经内置到 GitHub - Sjj1024/uniapp-vue3: 使用uniapp和vue3 ts …

搭建CMS系统

搭建CMS系统 1 介绍 内容管理系统(Content Management System,CMS)是一种用于管理、发布和修改网站内容的系统。开源的CMS系统有WordPress、帝国CMS等,国产的Halo很不错。 WordPress参考地址 # 官网 https://wordpress.org/# …

为什么IP地址需要划分为公有和私有地址?

一.知识点的解释 1.在现在的网络中,IP地址分为公网IP地址和私有IP地址。公网IP是在Internet使用的IP地址,而私有IP地址则是在局域网中使用的IP地址。 2.私有IP地址是一段保留的IP地址。只使用在局域网中,无法在Internet上使用。 二.为什么…

Python脚本必加代码:99%的程序员都忽视了这个细节!

文章目录 一、初识 if __name__ __main__二、__name__ 和 __main__ 是什么?三、实战讲解四、实际应用场景测试代码提高代码可重用性避免不必要的执行 五、深入理解和更多用法使用 argparse 解析命令行参数使用 unittest 进行单元测试使用 multiprocessing 创建子进…

c#入门学习笔记

p35 字符串 在字符串之前加上一个,可以保持原生字符,不用再进行转义(除了双引号)。 例如: "A short list: item 1 item 2"或者: "C:\Temp\MyDir\MyFile.doc"这相当于"C:\\Tem…

网盘攻略,羊毛薅到底,这4招太狠了

仅供参考 先买原石会员账户,再绑手机。 自己手机千万不要去注册115,先去马云家买原石会员帐户(五十多自带33T永久空间,非常实惠)。买完原石帐户后再用手机登录绑定帐户和修改密码。买8T永久空间8年VIP 然后再花560元买8T永久空间8年vip&…

嵌入式全栈开发学习笔记---C语言笔试复习大全22

目录 结构体 结构体的声明 定义结构体变量 访问结构体成员进行初始化 通过结构体变量名访问结构体成员 结构体指针 结构体指针的定义 通过结构体指针访问结构体成员 结构体数组 结构体数组的定义 遍历结构体数组 结构体的长度(笔试重点) 上一…

深入理解C++多态-虚函数

引言 C多态的实现方式可以分为静态多态和动态多态,其中静态多态主要有函数重装和模板两种方式,动态多态就是虚函数。下面我们将通过解答以下几个问题的方式来深入理解虚函数的原理: 为什么要引入虚函数?(用来解决什么…

2024年最新信息安全标准汇总

这些标准是我们在数字化时代保障网络安全、数据安全的重要基石,对于维护国家安全、企业利益和个人信息安全具有至关重要的作用。 随着科技的快速发展,网络空间的安全威胁也在不断演变,从复杂的网络攻击到个人信息泄露,这些安全风…

JAVA面试题大全(十四)

1、Kafka 可以脱离 Zookeeper 单独使用吗?为什么? kafka不能脱离zookper单独使用,因为kafka使用zookper管理和协调kafka的节点服务器。 2、Kafka 有几种数据保留的策略? Kafka提供了多种数据保留策略,这些策略用于定…

哈希双指针

文章目录 一、哈希1.1两数之和1.2字母异位词分组1.3最长子序列 二、双指针2.1[移动零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…

嵌入式0基础开始学习 ⅠC语言(7)指针

0.问题引入 int a 5; a 1024; //把1024存放到变量a的地址中去 b a; // 取变量a的值,赋值给b >在c语言中,任何一个变量,都有两层含义 (1)代表变量的存储单元的地址:变量的地址…

蓝桥楼赛第30期-Python-第三天赛题 统计学习数据题解

楼赛 第30期 Python 模块大比拼 统计学习数据 介绍 JSON(JavaScript Object Notation, /ˈdʒeɪsən/)是一种轻量级的数据交换格式,最初是作为 JavaScript 的子集被发明的,但目前已独立于编程语言之外,成为了通用的…

分享10个国内可以使用的GPT中文网站

在今天的人工智能领域,基于对话的语言模型已成为研究的热点,尤其是像 ChatGPT 这样因其出色的语言理解与对话交互能力而广受关注的模型。本文将介绍10个国内可以直接使用GPT的网站,旨在为大家在选择和使用这些优秀的AI工具时提供有价值的参考…

使用pyqt绘制一个爱心!

使用pyqt绘制一个爱心! 介绍效果代码 介绍 使用pyqt绘制一个爱心! 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget from PyQt5.QtGui import QPainter, QPen, QBrush, QColor from PyQt5.QtCore import Qt, Q…

[保姆式教程]使用目标检测模型YOLO V8 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

最近需要做基于卫星和无人机的农业大棚的旋转目标检测,基于YOLO V8 OBB的原因是因为尝试的第二个模型就是YOLO V8,后面会基于YOLO V9模型做农业大棚的旋转目标检测。YOLO V9目前还不能进行旋转目标的检测,需要修改代码 PS:欢迎大家分享农业大…

【研发日记】Matlab/Simulink技能解锁(九)——基于嵌入式处理器仿真

文章目录 前言 基于嵌入式处理器仿真 使用方式 第一步,硬件连接 第二步,配置硬件资源 第三步,配置XCP协议 第四步,加载Contrl Model 第五步,运行仿真 第六步,仿真报告 分析和应用 总结 参考资料 前言…

无线技术整合到主动噪声控制(ANC)增强噪声降低性能

主动噪声控制(ANC)已成为一种广泛使用的降噪技术。基本原理是通过产生与外界噪音相等的反向声波,将噪音中和,从而达到降噪的效果。ANC系统通常包括以下几个部分:参考麦克风、处理芯片、扬声器和误差麦克风。参考麦克风…