当前位置: 首页 > news >正文

再探“构造函数”(2)友元and内部类

文章目录

  • 一. 友元
    • ‘全局函数’作友元
    • ‘成员函数’作友元
    • ‘类‘作友元
  • 内部类

一. 友元

何时会用到友元呢?

当想让(类外面的某个函数/其它的类)访问 某个类里面的(私有或保护的)内容时,可以选择使用友元。

友元提供了一种突破(类访问限定符 封装)的方式,即在类外面也可以访问类里面的私有/保护成员。

友元的关键字:friend

友元的声明通常位于类的声明中,但其实现则位于类外部。

  • 友元分为2种:友元函数和友元类
    在这里插入图片描述

友元函数是一种特殊的函数,且它的声明是在类的内部,但它并不是类的成员函数

还有一个注意点是,只有类的静态成员或者静态成员函数才能直接用类名去访问。

在这里插入图片描述

class A
{
public:A(int a1):_a1(3){}int _a1=1;
};
int main()
{//这个是错误的std::cout << A::_a1 << std::endl;//这个是正确的A aa1(9);std::cout << aa1._a1 << std::endl;
}

在这里插入图片描述

class A
{
public:A(int a2){}static int _a1;int _a2 = 9;
};static int _a1 = 8;//static成员在全局初始化int main()
{//静态成员函数可以用类名去访问std::cout << A::_a1 << std::endl;
}

‘全局函数’作友元

(某个全局函数) 想要访问 (类A里的私有成员),直接访问的话,编译器会报错。


办法:我们可以告诉编译器,这个全局函数是类A的好朋友,它是可以访问类A的私有成员的,可以放心,不会出事儿。


措施:在类的内部声明,全局函数是友元


//类A
class A
{friend void quanjv(A& a);public:A(int a1, int a2):_a1(a1), _a2(a2){}
private:int _a1;int _a2;
};
//全局函数
void quanjv(A& a)
{std::cout << a._a1 << std::endl;
}int main()
{A a1(1, 2);quanjv(a1);return 0;
}

‘成员函数’作友元

(B的成员函数)想要访问(A的私有成员)


在A中声明友元函数,告诉编译器,B的某个成员函数是A的友元函数,可以访问A的私有成员。


class A
{friend void B::fang();
public:A(int a1):_a1(3){}
private:int _a1=1;
};
class B
{
public:B(int b1):_b1(3){}void fang(){A a1(9);std::cout << a1._a1 << std::endl;}private:int _b1 = 1;
};int main()
{B b1(8);b1.fang();return 0;
}

‘类‘作友元

在A类中声明友元函数,告诉编译器,B类是A类的好朋友,可以访问A类的私有成员

class A
{//告诉编译器,类B是类A的好朋友,B可以使用A的私有,保护成员friend class B;
public:A(int a1):_a1(3){}
private:int _a1 = 1;
};
class B
{
public:B(int b1):_b1(3){}void fang(){A a1(9);std::cout << a1._a1 << std::endl;}private:int _b1 = 1;
};int main()
{B b1(8);b1.fang();return 0;
}

内部类

我们可以将其理解为嵌套,即:一个类里面,嵌套了另一个类。(在里面的那个类,叫做内部类。)

class A
{public:class B{}
}

那什么时候考虑使用内部类呢?

如果说,类A的出现就是为了供类B使用,那么可以将类A设置为B的内部类。如果将A 放在private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了。

  1. 内部类的本质是:封装。
  2. 内部类是一个独立的类。跟定义在全局的类相比,唯一不同的就是:内部类受外部类的类域限制and访问限定符限制。
  3. 内部类是外部类的友元。
  4. 当计算外部类的大小sizeof时,内部类不计算在其中。

相关文章:

再探“构造函数”(2)友元and内部类

文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元 何时会用到友元呢&#xff1f; 当想让&#xff08;类外面的某个函数/其它的类&#xff09;访问 某个类里面的(私有或保护的)内容时&#xff0c;可以选择使用友元。 友元提供了一种突破&a…...

ffmpeg+vue2

一、安装依赖 npm install ffmpeg/core ffmpeg/ffmpeg "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1",二、配置ffmpeg 安装好插件以后&#xff0c;需要配置一下代码&#xff0c;否则会报错&#xff1a; 1、在vue.config.js…...

基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法

基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法引言YOLOv10简介目标检测轨迹跟踪测距算法实际应用结论 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 二轮电动车的目标检测、跟踪…...

鸿蒙ArkTS中的image组件

开发文档很详尽&#xff0c;就在DevEco中的API参考&#xff0c;可以随时调出来进行学习。 在鸿蒙官网也有非常详尽的资料&#xff0c;地址&#xff1a;开发说明-API参考概述 - 华为HarmonyOS开发者 (huawei.com) 这里&#xff0c;就学习image组件的一般用法以及使用SVG图标和字…...

LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))

【LetMeFly】684.冗余连接&#xff1a;拓扑排序哈希表&#xff08;O(n)&#xff09; 或 并查集&#xff08;O(nlog n)-O(nα(n))&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection/ 树可以看成是一个连通且 无环 的 无向 图。 给定往…...

让空气净化器“很听话”-置入NRK3502离线语音控制芯片

一、产品市场 随着智能家居的快速发展&#xff0c;人们对家居环境的舒适度与健康性要求日益提升&#xff0c;空气净化器作为改善室内空气质量的重要设备&#xff0c;其智能化升级变得尤为关键。让空气净化器“很听话”&#xff0c;不再仅仅是一个遥不可及的设想&#xff0c;而…...

8个Visio最佳替代软件推荐,每一款都堪称绘图神器

上午好&#xff0c;我的网工朋友。 绘图软件Visio是微软旗下知名的绘图软件&#xff0c;可用来绘制各种可视化图形&#xff0c;包括但不限于&#xff1a;流程图、人物关系图、组织架构图、思维导图、UML图、泳道图、甘特图、知识地图、软件架构图、鱼骨图等 它支持绘制的图形…...

微服务day02

教学文档&#xff1a; 黑马教学文档 Docker Docker的安装 镜像和容器 命令解读 常见命令 案例 查看DockerHub&#xff0c;拉取Nginx镜像&#xff0c;创建并运行容器 搜索Nginx镜像&#xff1a;在 www.hub.docker.com 网站进行查询 拉取镜像&#xff1a; docker pull ngin…...

使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法

在开发 Spring Boot 项目时&#xff0c;日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统&#xff0c;并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…...

NSET or MSET算法--原理解析

1.背景 NSET/MSET是一种非线性的多元预测诊断技术&#xff0c;广泛应用于系统状态估计、故障诊断和预测等领域&#xff1b;相比于传统的线性模型和方法&#xff0c;NSET/MSET能够更好地处理非线性系统&#xff0c;并提供更准确的预测和诊断能力。在早期&#xff0c;MSET融合了…...

NC6 系统配置的消息渠道配置配置涉及相关的表,用户使用admin登录

NC6 系统配置的消息渠道配置配置涉及相关的表 --电子邮件、公共短信属性值配置表,比如邮箱类型、邮件发送服务器、用户、密码、发件人地址、url等。 SELECT * FROM sm_msg_stypeprop;--消息发送方式配置:电子邮件,公共短信。 SELECT * FROM sm_msg_stypebase WHERE active …...

PXC数据库性能测试对比

mysql单机 #初始化测试数据 sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=xxx.xxx.xxx.xxx --mysql-db=test --mysql-user=hzhadmin --mysql-password=Admi --tables=10 --table-size=1000000 prepare#运行性能测试 sysbench /usr/share/sysbench/oltp_rea…...

使用AutoMySQLBackup 数据库自动备份

1.下载地址 AutoMySQLBackup的下在地址为http://sourceforge.net/projects/automysqlbackup/ 。 目前最新版本为automysqlbackup-v3.0_rc6.tar.gz 2.解压缩 把下载的automysqlbackup-v3.0_rc6.tar.gz文件拷贝到/usr/tmp下面 在/usr/local下面新建一个automysqlbackup文件夹…...

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储

随着云计算技术的日益成熟&#xff0c;越来越多的企业开始将其业务迁移到云端&#xff0c;以享受更为灵活、高效且经济的服务模式。在视频监控领域&#xff0c;云存储因其强大的数据处理能力和弹性扩展性&#xff0c;成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…...

13.React useTimeout

在 React 应用中,延迟执行某些操作是一个常见需求。传统的 setTimeout 在函数组件中使用可能会导致一些问题,如闭包陷阱或难以正确清理。useTimeout 钩子提供了一种声明式的方法来实现延迟执行,使得定时器的管理更加简单和可靠。这个自定义钩子不仅简化了定时器的使用,还解…...

Android待机问题与内存泄露日志定位及bugreport获取分析

文章目录 bugreportbugreport介绍获取bugreport日志分析bugreport安卓平台log获取日志android.logkernel.logkernel.log查看待机过程sysinfo.log判断内存是否有泄露分析bugreport,定位唤醒源,判断是否有ANR。分析安卓log,定位待机唤醒功耗问题,判断是否有内存泄露。bugrepo…...

访问控制技术原理与应用

目录 访问控制概述实现访问控制目标访问控制参考模型常见访问控制模型访问控制模型-DAC自主访问控制访问控制模型-MAC强制访问控制访问控制模型-RBAC基于角色的访问控制访问控制模型-ABAC基于属性的访问控制 访问控制概述 访问控制是对资源对象的访问授权控制的方法以及运行机…...

详解Rust标准库:Vec向量

查看本地官方文档 安装rust后运行 rustup doc查看The Standard Library即可获取标准库内容 std::vec::Vec定义 Vec除了可以作为动态数组还可以模拟为一个栈&#xff0c;仅使用push、pop即可 Vec默认分配在堆上&#xff0c;对于一个容量为4&#xff0c;有两个元素a、b的向量…...

网络原理(初一,TCP/IP五层(或四层)模型面试问题)

TCP/IP五层&#xff08;或四层&#xff09;模型 TCP/IP是⼀组协议的代名词&#xff0c;它还包括许多协议&#xff0c;组成了TCP/IP协议簇。 TCP/IP通讯协议采⽤了5层的层级结构&#xff0c;每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求。 • 应⽤层&#xff1a;负责…...

Unity引擎材质球残留贴图引用的处理

大家好&#xff0c;我是阿赵。   这次来分享一下Unity引擎材质球残留贴图引用的处理 一、 问题 在使用Unity调整美术效果的时候&#xff0c;我们很经常会有这样的操作&#xff0c;比如&#xff1a; 1、 同一个材质球切换不同的Shader、 比如我现在有2个Shader&#xff0c;…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...