C++核心编程---友元

目录

友元

友元的关键字  friend

友元的三种实现方式

1. 全局函数做友元

2. 类做友元

3. 成员函数做友元


友元

生活中你的家有客厅(Public),有你的卧室(Private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

但是呢,你也可以允许你的好闺蜜好基友进去。

在程序中,有些私有属性 也想让一些特殊的类或者类外特殊的函数访问,需要友元。

友元的目的是让一个函数或者类访问另一个类中的私有成员

类的主要特点是封装性,即类的私有成员只能被它自己的成员函数访问,类外的函数无法访问类的私有成员。有时候,外部函数需要直接访问类的私有数据成员,以便提高效率,这时就可以把这个外部函数定义为该类的友元函数。这种在某个类定义中用friend声明一个外部函数(也许是其他类的成员函数)的方法,就好像宣布了一种“亲友”关系,这个外部虽然不是该类的成员函数,却可以访问该类的所有成员,无论是公有成员还是私有成员。

如果没有友元机制,则只能将类的所有成员都定义为公有的,任何函数都可以无约束地访问它,但是这样做就破坏了类的封装性。而友元机制可以在不破坏类的封装性的前提下,提高类成员访问的灵活性。

友元函数常常是一个类的一个成员函数,这样通过友元函数可以使一个类对象直接访问另一个类对象的私有成员。这种成员函数不仅可以访问自己所在本类对象中的私有成员,还可以访问friend声明所在类的对象中的私有与公有成员。

当友元函数是另一个类的成员函数时,还应该在另一个类中声明它的友元关系。声明语句的格式为:

friend<函数类型><类名>::<函数名>(<形参表>);

说明:

(1)友元函数虽然可以访问对象的私有成员,但它毕竟不是类的成员函数,因此,在类的外部定义友元函数时,不必像成员函数那样在函数名之前加上“类名::”。

(2)友元函数一般带有一个该类的入口参数。因为友元函数不是类的成员,所以它不能直接引用对象成员的名字,也不能通过this指针引用对象成员。它必须通过作为入口参数传递过来的对象名或对象指针来引用该对象的成员。

友元的关键字  friend

友元的三种实现方式

  1. 全局函数做友元

  2.  类做友元

  3.  成员函数做友元

1. 全局函数做友元

示例:

#include<iostream>#include<string>using namespace std;// 房屋的类class building{// 设置 good 函数为友元 可以访问私有属性friend void good(building &Building);public:building(){m_sittingroom = "客厅";m_bedroom = "卧室";}string m_sittingroom;private:string m_bedroom;};// 全局函数void good(building &Building){cout<<"全局函数访问:"<<Building.m_sittingroom<<endl;cout<<"全局函数访问:"<<Building.m_bedroom<<endl;}int main(){building Building;good(Building);return 0;}

运行结果:

 

2. 类做友元

示例:

#include<iostream>#include<string>using namespace std;class building;class good_g{public:good_g();void visit(); // 参观访问Building中的属性private:building *Building;};// 房屋的类class building{// 设置good_g为本类的友元friend class good_g;public:building();string m_sittingroom;private:string m_bedroom;};// 类外写成员函数building::building(){this->m_sittingroom = "客厅";this->m_bedroom = "卧室";}good_g::good_g(){// 创建一个建筑物对象Building = new building; // 在堆区创建一个对象}void good_g::visit(){cout<<"good_g类正在访问:"<<Building->m_sittingroom<<endl;cout<<"good_g类正在访问:"<<Building->m_bedroom<<endl;}void test01(){good_g gg;gg.visit();}int main(){test01();return 0;}

运行结果:

 

3. 成员函数做友元

示例:

#include<iostream>#include<string>using namespace std;class building;class good_g {public:good_g();void visit(); // 参观访问Building中的属性void visit2(); // 访问不到building中的私有成员private:building* Building;};// 房屋的类class building {// good_g 类下的函数作为本类的友元,要加作用域才可以访问私有内容friend void good_g::visit();public:building();public:string m_sittingroom;private:string m_bedroom;};// 类外写成员函数building::building(){this->m_sittingroom = "客厅";this->m_bedroom = "卧室";}good_g::good_g(){// 创建一个建筑物对象Building = new building; // 在堆区创建一个对象}void good_g::visit(){cout << "visit 正在访问:" << Building->m_sittingroom << endl;cout << "visit 正在访问:" << Building->m_bedroom << endl;}void good_g::visit2(){cout << "visit2 正在访问:" << Building->m_sittingroom << endl;//cout<<"visit2 正在访问:"<<Building->m_bedroom<<endl;// visi2 访问不到buiding类中的私有成员,没有设置友元}void test01(){good_g gg;gg.visit();gg.visit2();}int main(){test01();return 0;}

运行结果:

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

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

相关文章

修复国产电脑麒麟系统开机出现initramfs 问题

目录预览 一、问题描述二、原因分析三、解决方案四、知识点呀initramfsBusyBox 五、参考链接 一、问题描述 国产麒麟系统出现 initramfs 模式 二、原因分析 一般在拷贝卡顿过程【强制关机】或者电【脑异常断电】的情况下概率性导致系统分区损坏&#xff0c;重启后大概率就会进…

⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战

⾯向对象编程&#xff1a;封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战 一、封装数据和⾏为 结构体定义 定义了一个名为Structural的结构体。结构体是一种用户自定义的数据类型&#xff0c;可以包含不同类型的字段&#xff08;成员变量&#xff09;。 与…

150行代码实现一个极简的Canvas多功能画板

目录 1.前言2.多功能画板的实现2.1 画板初始化2.2 画笔2.3 橡皮擦2.4 清屏2.5 前进和后退 3.小结 1.前言 HTML5提供的Canvas标签能实现很多有趣的效果&#xff0c;本文就来分享一下如何使用Canvas来实现一个极简的多功能画板。先来看效果&#xff1a; 主要实现以下功能&…

深度学习之基于Pytorch卷积神经网络的图像分类系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、图像分类系统四. 总结 一项目简介 基于PyTorch卷积神经网络的图像分类系统是一种应用深度学习技术来实现图像分类任务的系统。本摘要将对该系统…

Qt QWidget、QDialog、QMainWindow的区别

QWidget QWidget是Qt框架中最基础的窗口类&#xff0c;可以理解为用户界面的最基本单元。QWidget类提供了一个空白窗口&#xff0c;可以通过继承该类来创建自定义的窗口类。QWidget类提供了基本的窗口属性和方法&#xff0c;如大小、位置、标题、图标等。 QDialog QDialog是…

多路IO—POll函数,epoll服务器开发流程

引言 "在计算机网络编程中&#xff0c;多路IO技术是非常常见的一种技术。其中&#xff0c;Poll函数和Epoll函数是最为常用的两种多路IO技术。这两种技术可以帮助服务器端处理多个客户端的并发请求&#xff0c;提高了服务器的性能。本文将介绍Poll和Epoll函数的使用方法&am…

TiDB x 北京银行丨新一代分布式数据库的探索与实践

导读 随着业务规模的扩大&#xff0c;传统数据库面临诸多限制&#xff0c;分布式数据库成为解决之道。本文 介绍了北京银行在数字化转型过程中对分布式数据库技术的探索&#xff0c;分享了 TiDB 在北京银行的应用历程和未来展望 。 本文根据北京银行软件开发中心罗水华先生在…

VS2019 C# mysql数据库使用EF

mysql 安装mysql-8.0.18-winx64 mysql-connector-net-8.0.18.msi mysql数据库.net开发驱动&#xff0c; 要在工程中引入connector安装后目录中的mysql.data.dll;如果直接在nutget中下载mysql.data.dll&#xff0c;那么就不用下载.net开发驱动包 mysql-for-visualstudio-1.…

设计模式_状态模式

状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的&#xff1a;攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…

Spring底层原理(四)

Spring底层原理(四) 本章内容 模拟实现Spring中的几个常见BeanFactory后置处理器 常见的BeanFactory后置处理器 GenericApplicationContext context new GenericApplicationContext(); context.registerBean("config",Config.class); context.registerBean(Conf…

YOLOv7优化:独家创新(Partial_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(Partial_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLO…

试题二(15分)和试题三(15分) (软件设计师笔记)

&#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣…

模糊C均值聚类(FCM)python

目录 一、模糊C均值聚类的原理 二、不使用skfuzzy的python代码 三、 使用skfuzzy的python代码 一、模糊C均值聚类的原理 二、不使用skfuzzy的python代码 import numpy as np import random import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] plt.r…

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件

文章目录 1.ProgressBar2. ImageList3.ListView控件 1.ProgressBar 用于显示某个操作的进度。 属性&#xff1a; Value: 表示当前进度条的值&#xff0c;其范围由Min和Max决定。Step: 设置每次调用PerformStep()方法时增加的步长。MarqueeAnimationSpeed: 在Style设置为Marq…

二叉树问题——前/中/后/层遍历问题(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 103. 二叉树的锯齿形层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前…

MySQL连接的原理⭐️4种优化连接的手段性能提升240%

MySQL连接的原理⭐️4种优化连接的手段性能提升240%&#x1f680; 前言 上两篇文章我们说到MySQL优化回表的三种方式&#xff1a;索引条件下推ICP、多范围读取MRR与覆盖索引 MySQL的优化利器⭐️索引条件下推&#xff0c;千万数据下性能提升273%&#x1f680; MySQL的优化…

黄金矿工小游戏

欢迎来到程序小院 黄金矿工 玩法&#xff1a;点击开始游戏&#xff0c;黄金和钩子&#xff0c;钩子会左右摆动&#xff0c;对准黄金位置点击鼠标左键钓起黄金加对应时间&#xff0c;钓起黑色四块减去响应时间&#xff0c;快去挖矿吧^^。开始游戏https://www.ormcc.com/play/ga…

主播直播美颜SDK:提升颜值的秘诀

当下&#xff0c;主播们往往依赖于主播直播美颜SDK&#xff0c;这个技术工具为他们提供了一个让自己看起来更好看的机会。本文将深入探讨主播直播美颜SDK的工作原理、应用和影响&#xff0c;揭示提升颜值的秘诀。 一、主播直播美颜SDK是什么&#xff1f; 主播直播美颜SDK是一…

Latex排版SIGGRAPH总结(持续总结中...)

本文学习总结自&#xff1a;How to use the ACM SIGGRAPH / TOG LaTeX template 相关文件&#xff1a;百度网盘 首先解压 “my paper” 中的文件&#xff0c;并用Latex打开mypaper.tex. 多行连等公式 \begin{equation}表示编号公式&#xff0c;\[ \]表示无编号公式 无编号\b…