C++ 友元

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装 性和隐藏性,使得非成员函数可以访问类的私有成员。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。

同类对象间无私处。

异类对象间有友元。

友元函数

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函 数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上 关键字 friend,其格式如下:

friend 类型 函数名(形参列表); //声明可加在类中的任何位置

一个函数可以是多个类的友元函数,只需要在各个类中分别声明。

声明全局函数作为我的友元函数,并且使友元函数可以使用我的私有成员。就和在类内一般。

全局函数作友元函数

类成员函数作友元函数

前向声明——用之前必须进行申明

如果使用类A的时候需要使用类B,使用类B的时候需要使用A,那就取其一先声明,然后定义

class A;

class B{

public:

void test(A* a);

A* a;//不可以实例化,但是指针和引用是可以的,而指针只是存储一个地址,并没有实际生成一个对象,地址只是一个常整型数据,地址唯一不同的就是地址中存储的数据类型不同;引用的实质是常指针(指针常量)

A a1;//错误,不可以进行实例化,因为在此之前,你只是声明类A,A是 不完整类型

//实例化的时候必须先运行构造函数,然而A没有定义,就不知道A中的构造函数是什么,所以不可以

};

class A{

public:

B b;

int c;

};

void B::test(A* a) {

int d = a->c;

}

上图,并未进行真正的实例化,所以可以。

匿名对象

A(1);//实例化了一个类型为A的匿名对象,并进行了一个初始化构造,传参为int型1

为什么要向前声明Point?

友元对象

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:

友元是单向的,而非双向,类B是类A的友元类,类B可以存取类A的私有成员和保护成员,但是,类A却不可以存取类B的私有成员。

论友元

声明位置

友元声明以关键字 friend 开始,它只能出现在类定义中。因为友元不是授权类的 成员,所以它不受其所在类的声明区域 public private 和 protected 的影响。通常我们选择把所有友元声明组织在一起并放在类头之后。

友元的利弊

友元不是类成员,但是它可以访问类中的私有成员。友元的作用在于提高程序的运 行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 不过,类的访问权限确实在某些应用场合显得有些呆板,从而容忍了友元这一特别语法现象。

注意事项

不具有继承性

友元关系不能被继承。

单向性

友元关系是单向的,不具有交换性。若类 B 是类 A 的友元,类 A 不一定是类B 的友元,要看在类中是否有相应的声明。

不具有传递性

友元关系不具有传递性。若类 B 是类 A 的友元,类 C 是 B 的友元,类 C 不一定是类 A 的友元,同样要看类中是否有相应的声明。

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

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

相关文章

DC电源模块的模拟电源对比数字电源的优势有哪些?

BOSHIDA DC电源模块的模拟电源对比数字电源的优势有哪些? DC电源模块是一种电子元件,用于将交流电转换为直流电,以供电路板、集成电路等电子设备使用。在直流电源模块中,有模拟电源和数字电源两种类型。 模拟电源是一种传统的电源…

移动硬盘被格式化了如何恢复数据?四步教你如何恢复

在日常生活中,我们常常会使用各种存储设备来保存和备份我们的重要数据。移动硬盘作为一种便携式的存储设备,被广泛应用于数据的存储和传输。然而,有时候我们会不小心将移动硬盘格式化,从而丢失了里面的数据。本文将介绍移动硬盘格…

【SA8295P 源码分析 (三)】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…

基于MATLAB的图像条形码识别系统(matlab毕毕业设计2)

摘要 : 本论文旨在介绍一种基于MATLAB的图像条形码识别系统。该系统利用计算机视觉技术和图像处理算法,实现对不同类型的条形码进行准确识别。本文将详细介绍系统学习的流程,并提供详细教案,以帮助读者理解和实施该系统。 引言…

软件项目管理【UML-组件图】

目录 一、组件图概念 二、组件图包含的元素 1.组件(Component)->构件 2.接口(Interface) 3.外部接口——端口 4.连接器(Connector)——连接件 4.关系 5.组件图表示方法 三、例子 一、组件图概念…

LVS+Keepalived 实验

Keepalived 是什么 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题的一款检查工具 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器…

Vue笔记_插件组件_lucky-canvas抽奖转盘

文章目录 官网使用(vue2.x)[1] 下载[2] 引入[3] 使用配置项-width/height配置项-blocks配置项-prizes配置项-buttons优化案例 lucky-canvas 是一个基于 Js Canvas 的抽奖 web 前端组件,提供 大转盘和 九宫格两种抽奖界面,UI 精美,功能强大…

2020年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 要对二维列表所有的数据进行格式化输出,打印成表格形状,程序段如下: ls [[金京,89],[…

通达OA通用版V12的表单js定制开发,良好实践总结-持续更新

通达OA通用版V12的表单js定制开发的良好实践总结-持续更新 良好实践总结在表单中的js区域标准代码2023年10月19日获取地址栏:协议、域名/IP地址端口号获取地址栏的参数,比如run_id、flow_id等向表单中追加自定义css、js文件 良好实践总结 在webroot下的…

vue3学习(十)--- 依赖注入Provide 和 Inject

文章目录 Provide 和 Inject兄弟组件通信Event BusMitt库 Provide 和 Inject provide 可以在祖先组件中指定我们想要提供给后代组件----子、孙等组件的数据或方法,而在任何后代组件中,我们都可以使用 inject 来接收 provide 提供的数据或方法。 父组件…

如何通过沉浸式投影技术提升文旅夜游的互动体验?

伴随着国民经济的提升,文旅夜游市场也开始通过各类创新设计形式,来吸引更多的游客前来打卡游玩,使其逐渐成为了当下热度较高的一种游玩模式,其中在收集各类用户的体验反馈时,沉浸式投影依靠新颖的视觉体验以及沉浸式观…

SpringCloud-Sentinel

一、介绍 (1)提供界面配置配置服务限流、服务降级、服务熔断 (2)SentinelResource的blockHandler只处理后台配置的异常,运行时异常fallBack处理,且资源名为value时才生效,走兜底方法 二、安装…

android 指针动画转动

记录一种简单动画 效果图&#xff1a; 都是直接使用图片资源FrameLayout布局实现&#xff0c;布局如下&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…

python小游戏:飞机射击游戏代码

创建一个完整的飞行游戏涉及到许多方面&#xff0c;包括图形设计、游戏物理引擎和用户输入处理等。在这里&#xff0c;我将提供一个简单的基础框架&#xff0c;你可以在其基础上进一步扩展和完善游戏。 在这个示例中&#xff0c;我们将使用Pygame库来创建一个基本的飞行游戏。…

1-k8s1.23.6-底座搭建-基于docker

这里写自定义目录标题 一、服务器准备二、安装docker三、安装k8s四、安装部署dashboard 一、服务器准备 服务器准备 服务器名称服务器IP角色CPU(最低要求)内存(最低要求)master192.168.248.10master2核2Gworker1192.168.248.11node2核2Gworker2192.168.248.12node2核2G 修改ip&…

SEM和SD的区别和联系,以及其计算方法

http://t.csdnimg.cn/aHe99http://t.csdnimg.cn/aHe99

实现自动推送:工具助力公众号运营

公众号的运营离不开定期推送内容给用户&#xff0c;但手动推送过程繁琐且耗时。现在&#xff0c;借助乔拓云公众号助手工具&#xff0c;你可以轻松实现自动推送消息的功能。下面&#xff0c;我们一步一步教你如何操作。 首先&#xff0c;我们需要注册并登录乔拓云公众号助手工具…

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅲ—— 颁发自签名证书

目录 博文摘要5. 使用 Microsoft 证书颁发机构颁发自签名 SSL 证书5.1 登录MADCS5.2 申请证书5.3 选择证书类型5.4 提交CR5.5 下载 Base 64 编码的证书5.6 导出 CA 证书&#xff08;1&#xff09;打开 cachain.p7b&#xff08;2&#xff09;进入证书导出导向&#xff08;3&…

asp.net乒乓球场地管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乒乓球场地管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 乒乓球场地管理系统 二…

Python数据挖掘:自动售货机销售数据分析与应用

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…