C++ :友元类

友元类的概念和使用

(1)将类A声明为B中的friend class后,则A中所有成员函数都成为类B的友元函数了
(2)代码实战:友元类的定义和使用友元类是单向的
(3)友元类是单向的,代码实战验证

互为友元类

(1)2个类可以互为友元类,代码实战验证
(2)互为友元类要注意互相引用的细节规则

(1)友元类其实就是批量制造友元函数
(2)友元类中所有全部成员都成为了友元函数,相当于一次打了很多洞,极大破坏了面向对象
(3)除非确实有必要,否则建议按需定义友元函数,尽量维护面向对象,让代码更安全健壮

#include <iostream>
#include <string>class Country;  // Forward declaration of Country// External friend function declaration
void disp_info_external(const Country &ct);class InfoDisplayer {public:// Member function declarationvoid disp_info_member(const Country &ct) const;
};class InfoFriendClass {public:// Member function to display informationvoid display(const Country &ct) const;
};class Country {private:std::string privateName;protected:int protectedPopulation;public:std::string publicCapital;// ConstructorCountry(std::string name, int population, std::string capital): privateName(name),protectedPopulation(population),publicCapital(capital) {}// Friend function declarationfriend void disp_info_external(const Country &ct);// friend void InfoDisplayer::disp_info_member(const Country &ct);//error: no// declaration matches ‘void InfoDisplayer::disp_info_member(const Country&)’friend class InfoFriendClass;  // Friend class declaration
};// Definition of the external friend function
void disp_info_external(const Country &ct) {std::cout << "disp_info_external Name: " << ct.privateName << "\n";std::cout << "disp_info_external Population: " << ct.protectedPopulation<< "\n";std::cout << "disp_info_external Capital: " << ct.publicCapital << "\n";
}// Definition of the member friend function
void InfoDisplayer::disp_info_member(const Country &ct) const {// std::cout << "disp_info_member Name: " << ct.privateName << "\n";// error: ‘int Country::protectedPopulation’ is protected within this context//  std::cout << "disp_info_member Population: " << ct.protectedPopulation <<//  "\n"; std::cout << "disp_info_member Capital: " << ct.publicCapital <<//  "\n";
}// Definition of the friend class member function
void InfoFriendClass::display(const Country &ct) const {std::cout << "InfoFriendClass Name: " << ct.privateName << "\n";std::cout << "InfoFriendClass Population: " << ct.protectedPopulation << "\n";std::cout << "InfoFriendClass Capital: " << ct.publicCapital << "\n";
}int test070401() {// Create an object of CountryCountry myCountry("Wonderland", 5000000, "Magic City");// Display information using the external friend functiondisp_info_external(myCountry);// Create an object of InfoDisplayerInfoDisplayer displayer;// Display information using the member friend functiondisplayer.disp_info_member(myCountry);// Create an object of InfoFriendClassInfoFriendClass friendClass;// Display information using the friend class member functionfriendClass.display(myCountry);return 0;
}

在这里插入图片描述

#include <iostream>
#include <string>class Vegetable;  // Forward declaration of Vegetableclass Fruit {private:std::string name;protected:std::string color;public:// ConstructorFruit(std::string n, std::string c) : name(n), color(c) {}// Friend class declarationfriend class Vegetable;// Definition of the friend functionvoid displayVegetable(const Vegetable &veg);
};class Vegetable {private:std::string name;protected:std::string color;public:// ConstructorVegetable(std::string n, std::string c) : name(n), color(c) {}// Friend class declarationfriend class Fruit;// Member function declarationvoid displayFruit(const Fruit &fruit) const {std::cout << "Vegetable accessing Fruit's name: " << fruit.name << "\n";std::cout << "Vegetable accessing Fruit's color: " << fruit.color << "\n";}
};void Fruit::displayVegetable(const Vegetable &veg) {std::cout << "Fruit accessing Vegetable's name: " << veg.name << "\n";std::cout << "Fruit accessing Vegetable's color: " << veg.color << "\n";
}int test070402() {// Create objects of Fruit and VegetableFruit apple("Apple", "Red");Vegetable spinach("Spinach", "Green");apple.displayVegetable(spinach);// Display information using the member function of Vegetablespinach.displayFruit(apple);return 0;
}

在这里插入图片描述

为什么会有友元函数

使用友元函数的优缺点
(1)缺点:破坏了封装机制,尽量不使用友元函数,不得已才使用友元函数
(2)优点:在实现类之间数据共享时,减少系统开销,提高效率。

使用友元函数的两种情况
(1)运算符重载的某些场合需要使用友元
(2)两个类要共享数据的时候
两个类如何共享数据
(1)类内的数据,其实就是类的成员变量
(2)2个类共享数据方法1:将共享数据访问权限设置为public。
(3)2个类共享数据方法2:通过第三个专门封装数据的类,和2个类中带参数的成员函数来传参共享
(4)2个类共享数据方法3:通过友元函数打洞

友元函数和类的成员函数的区别
(1)成员函数有this指针,而友元函数没有this指针。为什么?因为友元只是朋友,并不是类内“自家人”
(2)友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
(3)友元关系不具有传递性。类B是类A的友元,类C是B的友元,类C不一定是类A的友元,要看类中是否有相应的声明

共有友元函数
(1)1个函数同时成为2个类的友元函数
(2)共有友元函数可以是外部函数,也可以是某个(第3个)类的成员函数
(3)共有友元函数内可同时访问2个类的受保护成员,间接将2个完全无关的类的数据打通了

总结

有元函数是单向的
两个类可以互为有元类、可以相互拥有有元方法
C++编译器在寻找运算符函数时,找的自己内部的函数,有就用显示实现的函数,没有的话就使用默认实现的,有元函数是外部函数,就不太编译器寻找范围内

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

刷题了:数组理论基础,704. 二分查找,27. 移除元素

学习记录&#xff0c;主要参考&#xff1a;代码随想录 数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组下标都是从0开始的 数组的元素是不能删的&#xff0c;只能覆盖。 704. 二分查找 要熟悉 根据 左闭右开&#xff0c;左闭右闭 两种区间规则 写出来…

Bubble Cup 13 - Finals [Online Mirror, unrated, Div. 2] --- G. Years (DSmap)

首先会想到树状数组或者差分&#xff0c;但是数据范围为1e9&#xff0c;所以不可取。 那么对于这道题就要用巧妙的方法。 我们可以看到题目也给出了一定的提示&#xff0c;输入的b和d代表了一个人的出生和死亡年份&#xff0c;那么也就是说&#xff0c;假如我们假设出眼前有一…

安全与加密常识(9)5分钟带你了解经常听到的cookie

文章目录 Cookie是什么Cookie有什么用Cookie的表示Cookie设置过程Cookie的生命周期 Cookie是什么 cookie的中文翻译是曲奇&#xff0c;小甜饼的意思。Cookie&#xff08;HTTP cookie&#xff09;是一种服务器存储在用户计算机上的小型数据文件&#xff0c;用于存储特定网站的用…

javaWeb 增删改查基本操作

通过之前的文章可以快速的了解SpringBoot 项目&#xff0c;这是一个关于增删改查的案例&#xff0c;可以巩固之前学习到的知识。 案例开始 准备工作 需求 开发员工管理系统&#xff0c;提供增删改查功能。 环境搭建 数据库&#xff08;mysql&#xff09; emp、dept表导入 #…

Oracle线上执行SQL特别慢的原因分析

一、背景&#xff1a; 线上反馈一张表select * from table where idxxx语句执行特别慢&#xff0c;超过60s超时不能处理&#xff0c;第一直觉是索引失效了&#xff0c;开始执行创建索引语句create index index_name on table() online。但是执行了超过20分钟索引还没有创建成功…

自动驾驶车道线检测系列—3D-LaneNet: End-to-End 3D Multiple Lane Detection

文章目录 1. 摘要概述2. 背景介绍3. 方法3.1 俯视图投影3.2 网络结构3.2.1 投影变换层3.2.2 投影变换层3.2.3 道路投影预测分支 3.3 车道预测头3.4 训练和真实值关联 4. 实验4.1 合成 3D 车道数据集4.2 真实世界 3D 车道数据集4.3 评估结果4.4 评估图像仅车道检测 5. 总结和讨论…

第59期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

【Python与GUI开发】事件处理与打包分发

文章目录 前言 一、高级事件处理 1.自定义事件 2.拖放操作 3.复杂控件的事件处理 二、打包和分发 Tkinter 应用 1.PyInstaller 2.cx_Freeze 3.spec 文件 4.分发注意事项 三、实战示例&#xff1a;文件浏览器 总结 前言 在前面的讨论中&#xff0c;我们深入理解了 T…

Dev—c++小熊猫6.7.5免费下载攻略

点击蓝字 关注我们 今天我来给大家分享一个Dev—c小熊猫6.7.5免费下载攻略&#xff0c;内容如下 1. https://gitee.com/royqh1979/Dev-CPP/releases/tag/v6.7.5 点进这一个官网&#xff0c;一直往下滑&#xff0c;找到第三个选项&#xff0c;把它下载下来。 2. 安装时一些选择…

自制OJ在线判题网站

项目效果啊演示&#xff1a; 项目链接&#xff1a; Gitee:Oj: 自定义实现的OJ在线做题网站&#xff0c;自主实现代码沙箱 (gitee.com) GitHub:GitHub - SakanaYdy/Oj 仓库中含有完整的项目流程PDF文档&#xff0c;可以参考自定义OJ网站。 目前只支持Java语言&#xff0c;可以…

CSA笔记3-文件管理命令(补充)+vim+打包解包压缩解压缩命令

grep(-i -n -v -w) [rootxxx ~]# grep root anaconda-ks.cfg #匹配关键字所在的行 [rootxxx ~]# grep -i root anaconda-ks.cfg #-i 忽略大小写 [rootxxx ~]# grep -n root anaconda-ks.cfg #显示匹配到的行号 [rootxxx ~]# grep -v root anaconda-ks.cfg #-v 不匹配有…

大模型算法专家的逻辑推演

大家好&#xff0c;我是卢麒。 如今&#xff0c;各大电商平台对于大模型算法的研发已经历经了无数次的迭代。 本文基于大模型算法的一些实际应用&#xff0c;做一些分析。 一&#xff0c;大模型算法专家的技术应用 作为大模型算法专家&#xff0c;在技术应用时&#xff0c;…

使用windows批量解压和布局ImageNet ISLVRC2012数据集

使用的系统是windows&#xff0c;找到的解压命令很多都linux系统中的&#xff0c;为了能在windows系统下使用&#xff0c;因此下载Git这个软件&#xff0c;在其中的Git Bash中使用以下命令&#xff0c;因为Git Bash集成了很多linux的命令&#xff0c;方便我们的使用。 ImageNe…

set类和map类介绍和简单使用

目录 set类介绍与简单使用 set类 multiset类 map类介绍与简单使用 map类 multimap类 set类介绍与简单使用 set类是一种关联式容器&#xff0c;在数据检索时比序列式容器效率更高。本质是一个常规的二叉搜索树&#xff0c;但是为了防止出现单支树导致效率下降进行了相关优…

Linux 命令 —— top命令(查看进程资源占用)

文章目录 top 命令显示信息介绍top 命令使用 top 命令显示信息介绍 top 命令是 Linux/Unix 系统中常用的进程监控工具&#xff0c;可以实时动态显示系统中各个进程的资源占用情况&#xff0c;包括CPU、内存等。 进入 linux 系统&#xff0c;直接输入 top&#xff0c;回车&…

2014-2024年腾势D9N7N8EVDMI维修手册和电路图资料线路图接线图

经过整理&#xff0c;2014-2024年腾势汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表…

中国星坤X0800HI系列线对板连接器:创新技术连接,引领智能家居未来!

近日&#xff0c;中国星坤推出的X0800HI系列线对板连接器&#xff0c;凭借其独特的设计和卓越的性能&#xff0c;引起了业界的广泛关注。 X0800HI系列线对板连接器在极小空间内实现了线对板的W-B连接&#xff0c;这不仅解决了传统连接方式中剥线和焊接的繁琐步骤&#xff0c;还…

Seata源码分析 全局事务开启提交回滚流程

文章目录 Seata全局事务源码Seata AT模式的设计思路源码入口TransactionalTemplate开启全局事务TM开启全局事务TC处理TM的请求 全局事务提交微服务端TM发送请求TC处理TM的请求RM处理TC的请求 全局事务回滚TM发送请求TC处理TM的请求RM处理TC的请求 补充知识微服务怎么找TC服务 S…

配置三层链路聚合增加链路带宽并提高可靠性的示例

规格 适用于所有版本的AR路由器。 AR161、AR161W、AR169、AR161G-L不支持该示例。 组网需求 在某小型企业网环境中部署了两台AR路由器Router_1和Router_2&#xff0c;Router_1作为用户接入设备&#xff0c;Router_2作为网络接入设备。为了保证用户的带宽&#xff0c;当用户量…

【Kaggle】练习赛《保险交叉销售的二分类预测》

前言 本篇文章介绍的是Kaggle月赛《Binary Classification of Insurance Cross Selling》&#xff0c;即《保险交叉销售的二元分类预测》。这场比赛非常适合作为机器学习入门者的实践练习。在之前的几期练习赛中&#xff0c;我们从多个角度详细讲解了探索性数据分析&#xff0…