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

友元类和友元函数

友元函数的定义:

友元函数是在类定义中被声明为 “朋友” 的非成员函数。它可以访问类的私有成员和保护成员(变量和方法),就好像它是类的成员函数一样。友元函数的声明以friend关键字开头,在类的内部进行声明,但它的定义在类的外部,和普通函数一样。

代码如下:

#include <iostream>
using namespace std;
class A
{   
public:friend void set_show(int x, A &a); //该函数是友元函数的声明
private:int data;  //私有的成员变量
protected:int pro=8;  //受保护的成员变量
};
void set_show(int x, A &a)//友元函数定义,为了访问类A中的成员变量data以及pro
{a.data = x;cout << a.data << endl;cout << a.pro <<endl;         
}
int main(void)
{class A a;set_show(1,a);return 0;
}

友元类的定义:

友元类是被另一个类声明为 “朋友” 的类。友元类的所有成员函数都可以访问声明它为友元的类的私有成员和保护成员。友元类的声明也是在类的内部使用friend关键字进行,格式为friend class 友元类名。

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。但是另一个类里面也要相应的进行声明。

代码如下:

class A {
public:friend class C;//友元类的声明
private:int data;
};
class C {  //友元类定义,为了访问类A中的成员
public:void set_show(int x, A& a){a.data = x;cout << a.data << endl;}
};
int main(void)
{class A a;class C c;c.set_show(1, a);//1return 0;
}

友元的作用:

友元提供了不同类的成员函数之间,类的成员函数和一般函数之间进行数据共享的机制。

通过友元,一个普通函数或者另一个类中的成员函数可以访问类中的私有成员和保护成员。友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和

数据的隐藏性,导致程序可维护性变差。一个函数可以是多个类的友元函数,但是每个类中都要声明这个函数,友元函数的声明和权限无关。

注意事项

1.破坏封装性

友元机制虽然方便,但它在一定程度上破坏了类的封装性。封装性是面向对象编程的重要特性之一,它隐藏了类的内部实现细节,使得类的内部数据结构和操作不易被外部代码随意访问和修改。过度使用友元可能会导致代码的可维护性降低,因为外部代码可以直接访问类的私有成员,使得类的内部实现对外部代码的依赖增加。

2.谨慎使用友元类

当一个类被声明为另一个类的友元类时,友元类的所有成员函数都可以访问被访问类的私有成员。这可能会导致意外的访问和修改。

例如,如果B类是A类的友元类,那么B类中的所有成员函数(fast)都可以访问和修改A类的私有成员。所以在设计时,要确保友元类中的函数确实有合理的理由访问另一个类的私有成员。

class A {int dis = 5;int pri = 4;void work(){cout << "work" << endl;}
protected:int pro = 1;
public:friend class B;//类B作为类A的友元类
};
class B {
public:void fast(){A a;//访问A类中的私有成员dis和受保护的成员procout << "dis: " << a.dis << "pro: " << a.pro << endl;//访问A类中的私有成员方法a.work();//修改A类中的私有成员变量pria.pri = 12;cout << "修改后的pri: " << a.pri << endl;}
};
int main()
{B b;b.fast();return 0;
}

3.友元关系不能被继承。因为友元关系是基于类的明确声明,而不是基于继承关系。

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

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

6.友元声明的位置和范围

在C++中,友元声明只是一种授权,它不遵循常规的访问控制和作用域规则。友元函数或友元类的声明可以放在类的私有、保护或公共部分,这只是一种声明位置的选择,不影响其作为友元访问类私有成员的能力。但是,友元函数本身的定义(如果是普通函数)或者友元类的成员函数定义(如果是友元类)还是要遵循常规的函数定义规则和作用域规则。例如,友元函数的定义通常需要在类的外部进行(除非是内联函数),并且要保证能够正确地访问所需的类对象和成员。

相关文章:

友元类和友元函数

友元函数的定义: 友元函数是在类定义中被声明为 “朋友” 的非成员函数。它可以访问类的私有成员和保护成员(变量和方法)&#xff0c;就好像它是类的成员函数一样。友元函数的声明以friend关键字开头&#xff0c;在类的内部进行声明&#xff0c;但它的定义在类的外部&#xff…...

Sulfo-Cy5-Iodoacetamide能够发出明亮的荧光信号,使得生物样本的精细结构得以清晰呈现

一、基本信息 英文名称&#xff1a;Sulfo-Cy5-Iodoacetamide&#xff0c;Sulfo-Cyanine5-Iodoacetamide&#xff0c;Sulfo Cy5 IA 中文名称&#xff1a;磺酸Cy5碘乙酰胺 分子式&#xff1a;C36H44IKN4O8S2 分子量&#xff1a;890.89 纯度&#xff1a;≥95% 外观&#xff…...

Python中的TCP

文章目录 一. 计算机网络1. 网络的概念2. IP地址① IP地址的概念② IP地址的表现形式③ IP地址的作用④ 网络查询命令Ⅰ. ifconfig/ipconfigⅡ. ping 3. 端口和端口号的概念(计算机通信原理)① 端口的概念② 端口号的概念 4. socket套接字① socket概念② socket使用场景 二. T…...

CSS(8)高级技巧:精灵图,css三角,用户界面,vertical-align属性应用

一.精灵图 通过css中的background-position属性&#xff0c;将多张图合成为一张图 二.css三角 在网页中&#xff0c;我们可以添加css属性获得三角图标 solid:实心&#xff0c;边框的实心 transparent:透明,图中代码表示只有左边粉色&#xff0c;其余地方为透明 三&#xff…...

Flink新版Source接口源码解析

目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…...

SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 S…...

一次失败的wxpython安装macOS M1

WARNING: The scripts libdoc, rebot and robot are installed in /Users/用户名/Library/Python/3.8/bin which is not on PATH. 背景&#xff1a;想在macos安装Robot Framework &#xff0c;显示pip3不是最新&#xff0c;更新pip3后显示不在PATH上 参看博主文章末尾 MAC系统…...

【大数据技术基础 | 实验十一】Hive实验:新建Hive表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;启动Hive&#xff08;二&#xff09;创建表&#xff08;三&#xff09;显示表&#xff08;四&#xff09;显示表列&#xff08;五&#xff09;更改表&#xff08;六&am…...

【yarn】yarn rest api每日job数量分析

一、说明 # 无法制定时间范围&#xff01;&#xff01;&#xff01; yarn application -list 官方文档 rest返回内容&#xff08;官网案例&#xff09;&#xff1a; {app":{"id":"application_1324057493980_0001","user":"user1&q…...

蓝桥杯单片机第十一届省赛(第一场)

主函数代码 #include<iic.h> #include<intrins.h>sfr P40xc0; sbit R3P3^2; sbit R4P3^3; sbit C4P3^4; sbit C3P3^5;unsigned char code led_nodot[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char code led_dot[]{0x40,0x79,0x24,0x30,0x…...

hive复杂数据类型Array Map Struct 炸裂函数explode

1、Array的使用 create table tableName( ...... colName array<基本类型> ...... ) 说明&#xff1a;下标从0开始&#xff0c;越界不报错&#xff0c;以null代替 arr1.txtzhangsan 78,89,92,96 lisi 67,75,83,94 王五 23,12 新建表&#xff1a; create table arr1(n…...

FIFO架构专题-FIFO是什么

目录 简介&#xff1a; FIFO参数&#xff1a; 1.宽度WIDTH&#xff08;一次位数&#xff09; 2.深度DEEPTH&#xff08;存多少次&#xff09; FIFO的分类&#xff1a; 同步FIFO 异步FIFO 读写位宽不同的FIFO FIFO信号介绍 写时钟 写数据 写使能 读时钟 读数据 读…...

Pythony——多线程简单爬虫实现

简单爬虫实现 import requests from bs4 import BeautifulSoup# 生成要爬取的网页地址列表&#xff0c;这里是博客园的分页地址&#xff0c;从第1页到第50页 urls [f"https://www.cnblogs.com/#p{i}" for i in range(1, 50 1)]# 生产者函数——负责下载网页内容 d…...

如何修改 a 链接的样式

在CSS中&#xff0c;你可以使用选择器来针对HTML中的特定元素&#xff08;例如<a>标签&#xff0c;也就是链接&#xff09;进行修改样式。以下是一些常见的修改<a>链接样式的方法&#xff1a; 移除下划线&#xff1a; a { text-decoration: none; } 修改链接的…...

第6章 详细设计-6.5 软硬件接口文档设计

6.5 软硬件接口文档设计 一般的产品都包含硬件和软件两部分&#xff0c;产品设计阶段需要确保硬件开发人员和软件开发的沟通准确、高效。所以需要一份书面的文档来承载软件和硬件之间的沟通细节。以下面的细水雾除尘设备为例进行讲解&#xff0c;涉及软件和硬件的接口&#xff…...

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…...

C++全局构造和初始化

片段摘自程序员的自我修养—链接、装载与库.pdf 11.4 程序在进入main之前&#xff0c;需要对全局对象进行构造初始化。 glibc全局对象进行构造初始化 gibc启动程序时会经过.init段&#xff0c;退出程序时会经过.finit段。这两个段中的代码最终拼接成_init()和_finit(),这两个…...

安全见闻-泷羽sec课程笔记

编程语言 C语言&#xff1a;一种通用的、面向过程的编程语言&#xff0c;广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来&#xff0c;支持面向对象编程&#xff0c;常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言&#xff0c;具有跨平台…...

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …...

【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )

文章目录 一、av_packet_ref 函数1、函数原型2、函数源码分析3、函数使用代码示例 二、av_packet_clone 函数1、函数原型2、函数源码分析 FFmpeg 4.0 版本源码地址 : GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0GitCode : https://gitcode.com/gh_mirrors/ff…...

【学习笔记】量化概述

Quantize量化概念与技术细节 题外话&#xff0c;在七八年前&#xff0c;一些关于表征的研究&#xff0c;会去做表征的压缩&#xff0c;比如二进制嵌入这种事情&#xff0c;其实做得很简单&#xff0c;无非是找个阈值&#xff0c;然后将浮点数划归为零一值&#xff0c;现在的Qu…...

同步互斥相关习题10道 附详解

PV操作 2016 某系统允许最多10个进程同时读文件F&#xff0c;当同时读文件F的进程不满10个时&#xff0c;欲读该文件的其他文件可立即读&#xff0c;当已有10个进程在读文件F时读&#xff0c;其他欲读文件F的进程必须等待&#xff0c;直至有进程读完后退出方可去读 在实现管…...

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)

【Python PyTorch】卷积神经网络 CNN&#xff08;LeNet-5网络&#xff09; 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...

Git 拉取指定分支创建项目

一 背景 因为项目过大&#xff0c;只需要部分分支的代码即可。 二 实现 方法一&#xff1a;使用 --single-branch 参数 git clone 支持只拉取指定分支&#xff0c;而不是整个库的所有分支&#xff1a; git clone --branch <branch_name> --single-branch <reposi…...

CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)

思路&#xff1a;一个二分图是由两个集合组成的&#xff0c;同一个集合中的节点间不能连边&#xff0c;所以一个二分图最多有cnt[1]*cnt[2]条边&#xff0c;题目给出一个树的n-1条边&#xff0c;要我们添加最多的边数使他成为二分图&#xff0c;添加的边数就是cnt[1]*cnt[2]-n1…...

React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础

在 React Native 应用中&#xff0c;数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理&#xff0c;包括 React Hooks、Context API 以及第三方状态管理库&#xff08;如 Redux&#xff09;。本章节将详细介绍 React Hooks 的基础…...

传奇996_22——自动挂机

登录钩子函数中执行 callscript(actor, "../QuestDiary/主界面基础按钮/主界面基础按钮QM", "基础按钮QM")基础按钮QM执行了已下代码 #IF Equal <$CLIENTFLAG> 1 #ACT goto PC端面板加载#IF Equal <$CLIENTFLAG> 2 #ACT goto 移动端面板加载…...

faiss 提供了多种索引类型

faiss 多种索引类型 在 faiss 中&#xff0c;IndexFlatL2 是一个简单的基于 L2 距离&#xff08;欧几里得距离&#xff09;进行索引的索引类型&#xff0c;但实际上&#xff0c;faiss 提供了多种索引类型&#xff0c;支持不同的度量方式和性能优化&#xff0c;您可以根据需求选…...

比rsync更强大的文件同步工具rclone

背景 多个复制&#xff0c;拷贝&#xff0c;同步文件场景&#xff0c;最大规模的是每次几千万规模的小文件需要从云上对象存储中拉取到本地。其他的诸如定期数据备份&#xff0c;单次性数据备份。 rsync是单线程的&#xff0c;开源的mrsync是多线程的&#xff0c;但适用范围没…...

《业务流程--穿越从概念到实践的丛林》读后感一:什么是业务流程

1.1 流程和业务流程概念辨析 业务流程建模标准(BPMN)对于业务流程的定义:一个业务流程由为了配合一个组织性或技术环境而一系列活动组成。这些活动共同实现一个业务目标。 业务流程再造最有名的倡导者托马斯.H.达文波特对于流程和业务流程的定义:流程是一组结构化且可度量的…...

云服务器怎么样做网站/seo整站优化新站快速排名

本文面向需要在不同版本的 TensorFlow 之间向后兼容&#xff08;针对代码或者数据&#xff09;的用户&#xff0c;以及想要修改 TensorFlow 并同时保持兼容性的开发者。 语义化版本控制 2.0 TensorFlow 的公开 API 遵循语义化版本控制 2.0 (semver)。每个版本的 TensorFlow 都采…...

汽车网站制作/今日头条新闻最全新消息

在上一篇文章中&#xff0c;我们分析了Android系统进程间通信机制Binder中的Server在启动过程使用Service Manager的addService接口把自己添加到Service Manager守护过程中接受管理。在这一篇文章中&#xff0c;我们将深入到Binder驱动程序源代码去分析Client是如何通过Service…...

在哪个平台做网站好/站长网站seo查询

VUE里面的{{}}符合可以书写JS表达式&#xff0c;但是不可以书写语句。例子&#xff1a; <!DOCTYPE html> <html> <head><title>VUE hello world</title><script src"https://unpkg.com/vue/dist/vue.js"></script><sty…...

网站建设 检查 通报/河源疫情最新通报

外观模式 为子系统中的一组接口提供一个一致的界面&#xff0c; Facade模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 外观模式三要素&#xff08;client-facade-subSystem&#xff09; 外观角色&#xff08;facade&#xff09;&#xff0c;是模式的…...

网站开发必须要做前端吗/整合营销方案怎么写

管了一段时间论坛&#xff0c;了解到网民对流氓软件有着切肤之痛&#xff0c;不少网友尝试用各种办法来尝试清除流氓软件。结果却发现流氓软件和病毒软件相比&#xff0c;流氓软件更难清除。这其中有一个深刻的原因&#xff0c;病毒通常是个人或小工作室制作&#xff0c;而流氓…...

北京做网站公司有哪些/湖南好搜公司seo

最近项目当中有个场景问题&#xff0c;需要在数据更新完成之后&#xff0c;发送mq消息通知周边系统进行操作。但是周边系统需要用到当前事务更新完成的数据。经常出现mq消息处理过程中拿不到更新之后的数据。经过排查日志&#xff0c;查看sql执行情况&#xff0c;代码逻辑。还跟…...