类和对象-友元-全局函数做友元

全局函数做友元

#include<iostream>
using namespace std;class  Building 
{//goodGay全局函数是Building好朋友,可以访问Building的私有成员 friend void goodGay(Building *building);
public:Building(){m_SittingRoom = "客厅";m_BedRoom = "卧室";}
public:string m_SittingRoom;//客厅
private:string m_BedRoom;//卧室 
};//全局函数
void goodGay(Building *building)
{cout<<"好基友全局函数 正在访问:"<<building->m_SittingRoom<<endl;cout<<"好基友全局函数 正在访问:"<<building->m_BedRoom<<endl;
} 
void test01()
{Building building;goodGay(&building);
} 
int main()
{test01();return 0;
}

在全局函数 void goodGay(Building *building) 中为什么要传入 Building *building
指针呢?

友元函数的概念

在C++中,友元函数是一种特殊的函数,它不是类的成员函数,但被允许访问类的私有成员和保护成员。友元函数可以通过两种方式实现:

  1. 友元函数声明为类的友元:在类的定义中声明友元函数,这样友元函数就可以直接访问类的私有成员和保护成员。
  2. 传递类的对象或指针给友元函数:即使友元函数不是类的成员函数,通过传递类的对象或指针给友元函数,也可以实现访问私有成员和保护成员的目的。

在代码中的体现

代码中展示了第二种方式:全局函数 goodGay 被声明为类 Building 的友元函数,并通过传递 Building *building 指针来访问 Building 类的私有成员 m_SittingRoomm_BedRoom

为什么使用指针作为参数?

在这里,使用指针作为参数有以下几个原因:

  1. 直接访问类的私有成员:指针可以直接操作对象的成员,包括私有成员,因为指针的访问权限通常比对象的成员函数更灵活。

  2. 避免对象的复制:如果使用对象作为参数,会涉及到对象的复制构造函数,特别是当对象较大或者复制开销较大时,效率可能不高。使用指针避免了这种复制。

  3. C++语言的传统做法:在传递大型对象时,通常会使用指针或引用,而不是直接复制对象。

示例中的具体情况

test01 函数中,创建了一个 Building 对象 building,并将其地址作为参数传递给 goodGay 函数。在 goodGay 函数内部,通过指针访问了 building 对象的私有成员 m_SittingRoomm_BedRoom

void goodGay(Building *building)
{cout << "好基友全局函数 正在访问:" << building->m_SittingRoom << endl;cout << "好基友全局函数 正在访问:" << building->m_BedRoom << endl;
} void test01()
{Building building;goodGay(&building); // 将building对象的地址传递给goodGay函数
} 

因此,使用指针作为参数是为了在全局函数中访问类的私有成员,并且遵循了C++中友元函数的设计原则,允许在不将函数定义为类的成员函数的情况下访问私有成员。

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

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

相关文章

MyBatis学习笔记-数据脱敏

如果项目需要对一些特殊、敏感的数据进行脱敏处理。根据实际的需求可以考虑在读写的过程中分别做脱敏操作。 一、写过程参数脱敏 主要是使用mybatis框架提供的Interceptor实现。需要考虑不同类型的参数解析处理方式不同。 @Slf4j @AllArgsConstructor @Intercepts({@Signatu…

【vuejs】vue-router 之 addRoute 动态路由的应用总结

1. Vue Router 概述 Vue Router 是 Vue.js 官方的路由管理器&#xff0c;用于构建单页面应用。它与 Vue.js 深度集成&#xff0c;让开发者能够轻松地构建具有复杂用户界面的单页面应用。Vue Router 允许你定义不同的路由&#xff0c;并通过 router-view 组件在应用中显示匹配的…

【CSS】如何实现分栏布局

在CSS分栏布局中&#xff0c;设置宽度和样式是一个基本且重要的步骤。这可以通过直接应用样式到列元素&#xff08;通常是div元素&#xff09;上来实现。以下是一些常用的方法来设置分栏布局的宽度和样式&#xff1a; 1. 使用百分比宽度 使用百分比宽度可以使列的大小相对于其…

MyBatis学习笔记-参数转义处理

查询参数中如果有传入%的情况,数据会被全量返回。类似的可能还会有一些特殊符号的情况存在。这个时候可能需要在查询数据的时候进行参数转义处理。一般情况可能会考虑选择下面的两种方式处理。 一、基于Filter处理 主要通过实现Filter接口,自定义HttpServletRequestWrapper…

Stable Diffusion秋叶AnimateDiff与TemporalKit插件冲突解决

文章目录 Stable Diffusion秋叶AnimateDiff与TemporalKit插件冲突解决描述错误描述&#xff1a;找不到模块imageio.v3解决&#xff1a;参考地址 其他文章推荐&#xff1a;专栏 &#xff1a; 人工智能基础知识点专栏&#xff1a;大语言模型LLM Stable Diffusion秋叶AnimateDiff与…

Java 汉诺塔问题 详细分析

汉诺塔 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小…

vulnhub靶场ai-web 2.0

1 信息收集 1.1 主机发现 arp-scan -l 主机地址为192.168.1.4 1.2 服务端口扫描 nmap -sS -sV -A -T5 -p- 192.168.1.4 开放22&#xff0c;80端口 2 访问服务 2.1 80端口访问 http://192.168.1.4:80/ 先尝试admin等其他常见用户名登录无果 然后点击signup发现这是一个注…

prescan软件中导入路径文件txt/lpx

由于博主收到的是lpx格式的路径文件&#xff0c;因此&#xff0c;第一步 1.记事本打开 ctrla 全选 ctrlc 复制 2.新建一个excel 鼠标定位到第一行第一列的格子 ctrlv 复制 3.数据栏“分列”功能 4. (0.1递增的数列&#xff0c;纬度&#xff0c;经度&#xff0c;高程) 导入…

python——面向对象小练习士兵突击与信息管理系统

士兵突击 需求 1. 士兵 许三多 有一把 AK47 2. 士兵 可以 开火 3. 枪 能够 发射 子弹 4. 枪 装填 装填子弹 —— 增加子弹数量 # 士兵突击 # 需求 # 1. 士兵 许三多 有一把 AK47 # 2. 士兵 可以 开火 # 3. 枪 能够 发射 子弹 # 4. 枪 装填 装填子弹 —— 增加子弹数量 cl…

JDBC操作流程

目录 简介 具体操作 1. 引入驱动包 1&#xff09;下载驱动包 2&#xff09;引入驱动包到项目中 2. 编写代码 1&#xff09;创建数据源 2&#xff09;建立连接 3&#xff09;构造 SQL 语句 4&#xff09;执行 SQL 语句 5&#xff09;释放资源 总结 简介 JDBC 就是使…

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码&#xff08;复制即用&#xff09; 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

C语言+ MSSQL技术开发的 PACS系统源码:CT后处理技术之仿真内镜CTVE

C语言 MSSQL技术开发的 PACS系统源码&#xff1a;CT后处理技术之仿真内镜CTVE 仿真内窥镜VE VE是利用医学影像作为原始数据&#xff0c;融合图像处理、计算机图形学、科学计算可视化、虚拟现实技术&#xff0c;模拟传统光学内镜的一种技术。 又叫做腔内重建技术&#xff0c;是…

试用笔记之-汇通来电显示软件

首先汇通来电显示软件下载 http://www.htsoft.com.cn/download/httelephone.rar

平衡树专题Splay

写在前面&#xff1a; 部分来自孙宝&#xff08;Steven24&#xff09;的博客&#xff0c;表示感谢。 认识 什么是Splay 就是BST的一种&#xff0c;整体效率是很高的&#xff0c;均摊的次数是O(logn)级别的。 基本操作就是把节点旋转到BST的root&#xff0c;从而改善BST的平…

为适配kubelet:v0.4 安装指定版本的docker

系统版本信息 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 0.4 版本的kubelet 报错信息记录 E0603 19:00:38.273720 44142 kubelet.go:734] Error syncing pod: API error (400): {"message": "starting container with non-empty reque…

免交互简单操作

免交互 交互&#xff1a;我们发出指令控制程序的运行&#xff0c;程序在接收到指令后按照指令的效果作出对应的反应 免交互&#xff1a;间接的&#xff0c;通过第三方的方式把指令传给程序&#xff0c;不用直接下达指令 Here Document免交互 这是命令行格式&#xff0c;也可…

不用找了!这个软件自带各行业话术,客服效率飞跃

有一款客服工具软件&#xff0c;不但能吸附聊天窗口&#xff0c;实现图文视频话术的一键发送&#xff0c;还内置了多行业的优质客服话术模板&#xff0c;允许用户直接下载使用&#xff0c;快速构建起适合自身企业的专业客服知识库。 前言 在今天的快节奏商业环境中&#xff0c…

Linux shell脚本编程

一、sehll简介&#xff1a; 用户通过shell向计算机发送指令的 计算机通过shell给用户返回指令的执行结果 1.1、通过shell编程可以达到的效果 提高工作的效率 可以实现自动化 1.2、sehll脚本编写的流程 1、用vi/vim创建一个.sh的文件 2、在文件中进行开发 3、个文件赋予可执行权…

CesiumJS【Basic】- #047 绘制闪烁线(Entity方式)- 需要自定义着色器

文章目录 绘制闪烁线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts绘制闪烁线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制闪烁线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium<

【如何使用RSA签名验签】python语言

文章目录 签名方法异步同步通知数据验签生活号响应数据验签同步响应数据验签 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的…