当前位置: 首页 > 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…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...