C++ 重点内容:友元

目录

友元函数:

友元成员函数:

友元类:

友元是否有悖于OOP?

总结:

  • 类因为具有封装信息隐藏的特性(类外函数无法访问类的私有、保护成员,C++提出友元解决特定的编程需要;
  • 友元分为三类:友元函数、友元成员函数、友元类
  • 类中友元虽然不是类的成员函数,但是可以访问类的私有成员

友元函数:

友元函数既可以是一个不属于任何类的普通函数也可以是一个类的成员函数,友元函数可以访问类的私有成员(private)保护成员(protected)

普通函数作为友元函数:

friend 返回值类型 函数名 (参数列表)
class B
{
private :int a;int b;
protected:int aa;
public:int c;B(int i=1, int j=2,int k=3,int t=4) :a(i), b(j) ,c(k),aa(t){};void show(){ cout << "a:" << a << ",b:" << b << ",c:" << c << ",aa:" << aa << endl; }friend void geta(B& b1);//友元函数
};void geta(B& b1) //B 的友元函数
{cout << "class B 的私有成员a:" << b1.a << endl;cout << "class B 的保护成员aa:" << b1.aa<< endl;
}
int main()
{B b;b.show();geta(b);
}

友元成员函数:

友元成员函数格式 相比 友元函数,多了类名::限定

friend 返回值类型 类名::函数名(参数列表);

代码示例,一个类的成员函数访问另一个类的私有成员

//友元成员函数:
class peo;
class th//销售产品:
{int banana;int apple;
public:th(int a=5, int b=4) :banana(b), apple(a) {};//构造函数 初始化int sum(const peo& p);//求销售总额
};
class peo//销售人数
{
private:int b_p;int a_p;
public:peo(int a = 4, int b = 5) :b_p(b), a_p(a) {};friend int th::sum(const peo& p);//类的成员函数声明为友元成员函数
};
int th::sum(const peo& p)
{return  p.a_p * apple + p.b_p * banana;
}int main()
{peo a;th b;cout << "销售总额为:"<<b.sum(a) << endl;
}

友元类:

A 中所有的成员函数都想访问 类B中的私有和保护成员,则在类B 中声明 类A为其的友元类。

在哪个中声明,哪个类就被访问

友元类 有另一种较为繁琐的实现方式:将类A 所有的成员函数声明为 B 的友元成员函数。

friend class 类名
//友元类
class Date //日期类
{
private:int year;int month;int day;
public:Date(int y=0, int m=0, int d=0) :year(y), month(m), day(d){}friend class DateFriend; //友元类,DateFriend是自己(Date类)的友元类
};class DateFriend
{
public:void modifyDate(Date& date, int year, int month, int day);//修改日期void show(const Date& date);//输出数据
};void DateFriend::modifyDate(Date& date, int year, int month, int day)//修改日期
{date.day = day;date.month = month;date.year = year;
}
void DateFriend::show(const Date& date)//输出数据
{cout << date.year << "-" << date.month << "-" << date.day<<endl;
}
int main()
{Date a(2023, 12, 20);DateFriend b;b.show(a);b.modifyDate(a,2024,1, 26);b.show(a);return 0;
}

友元是否有悖于OOP?

友元机制允许非成员函数访问保护成员、私有成员(违反了OOP数据隐藏原则)?

解答:

友元任然遵循OOP :友元函数可看做类的扩展接口的组成部分,每次友元的声明都在类内,即在类有控制与选择的基础上声明友元,类自愿将私有保护成员分享给被声明的类或者函数,使得该函数有权限访问类外函数无法访问的数据(声明类被访问),并没有破坏OPP。

总结:

类的友元函数:函数访问类内私有、保护成员
类的成员友元函数:
类的友元类:友元类访问类内私有、保护成员

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

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

相关文章

idea用version标签配置版本号报错版本号missing

问题描述&#xff1a; 用<mybatis-plus.version>3.3.2</mybatis-plus.version>配置pom的版本号&#xff0c;报错 dependencies.dependency.version for com.baomidou:mybatis-plus-boot-starter:jar is missing. line 33, column 21详细报错如下&#xff1a; 详…

安卓开发——Activity及常用布局和控件的使用

Activity及常用布局和控件的使用 一、实验目的 掌握Android常用布局和控件的使用。 Activity组件使用和Intent机制&#xff0c;加强对Activity生命周期的理解 二、实验设备及器件 Android Studio&#xff0c;图标&#xff1a;http://10.37.59.210/download/icon/MobileShopI…

记签名机制

签名过程&#xff1a; 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本&#xff09;. http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…

【复现 3D Gaussian Splatting】protobuf的版本太高而导致编译错误

输入训练&#xff1a; (base) C:\Users\15893\gaussian-splatting>python train.py -s data/tandt/train报错内容如下&#xff1a; If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc > 3.19.0.If you …

Spring: alibaba代码规范校验工具checkstyle

文章目录 一、idea配置checkstyle插件二、激活CheckStyle三、配置自动格式化功能 一、idea配置checkstyle插件 下载 Intellij IDEA Checkstyle 插件&#xff1a;File -> setting -> plugin通过关键字CheckStyle-IDEA搜索并安装。 安裝完成后重启idea 二、激活CheckSty…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)-机器人、强化学习

专属领域论文订阅 关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 具身智能&#xff0c;机器人强化学习开放词汇&…

模拟问题刷题

模拟类题目是机试题中出现频率很高的一种类型&#xff0c;这类题目的特点是并不涉及特别高 深的知识&#xff0c;只需利用程序实现题目的要求。由于这类题目通常不需要经过太多的思考&#xff0c;所以能够很纯粹地考查考生的编程能力。 1. 图形排版 图形排版是最为常见的模拟…

利用aiohttp异步爬虫实现网站数据高效抓取

前言 大数据时代&#xff0c;网站数据的高效抓取对于众多应用程序和服务来说至关重要。传统的同步爬虫技术在面对大规模数据抓取时往往效率低下&#xff0c;而异步爬虫技术的出现为解决这一问题提供了新的思路。本文将介绍如何利用aiohttp异步爬虫技术实现网站数据抓取&#x…

【UE插件DTRabbitMQ】 虚幻引擎蓝图连接RabbitMQ服务器使用插件说明

本插件可以使用蓝图连接 RabbitMQ服务器&#xff0c;并推送或者监听消息。 下载地址在文章最后。 1. 节点说明 Create RabbitMQ Client - 创建RabbitMQ客户端对象 创建一个RabbitMQ客户端对象&#xff0c;返回的对象需要提升为变量&#xff0c;以后就是用这个对象去操作。 Con…

Leetcode2826. 将三个组排序

Every day a Leetcode 题目来源&#xff1a;2826. 将三个组排序 解法1&#xff1a;贪心 二分查找 最长递增子序列的变种题。 利用 Leetcode300. 最长递增子序列 的方法&#xff0c;求出数组 nums 的最长递增子序列 g&#xff0c;最后答案为 nums.size() - g.size()。 代码…

【JaveWeb教程】(34)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(7)配置文件的设置

目录 SpringBootWeb案例054. 配置文件4.1 参数配置化4.2 yml配置文件4.3 ConfigurationProperties SpringBootWeb案例05 前面我们已经实现了员工信息的条件分页查询以及删除操作&#xff0c;以及实现新增和修改员工。 本节的主要内容&#xff1a; 配置文件的设置 4. 配置文件…

nginx反向代理负载均衡

一&#xff0c;kali作为负载服务器 打开kali nginx服务&#xff0c;访问页面如下 使用docker拉取nginx&#xff0c;并做出端口映射 ┌──(root?kali)-[/etc/nginx] └─# docker pull nginx ┌──(root㉿kali)-[/etc/nginx] └─# docker run -p 11111:80 --name Jdr -d ng…

C++ STL之priority_queue的使用及模拟实现

文章目录 1. 介绍2. priority_queue的使用3. priority_queue的模拟实现 1. 介绍 英文解释&#xff1a; 也就是说&#xff1a; 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 此上下文类似于堆&#xff0c…

算子:详细篇

目录 一、执行环境 1.1 创建执行环境 1.2 执行模式 二、源算子 2.1 从集合中读取数据 2.2 从文件读取数据 2.3 从socket读取数据 2.4 从kafka读取数据 三、转换算子 3.1 基本转换算子 &#xff08;1&#xff09;映射(map) &#xff08;2&#xff09;过滤(filter) &#xff08…

新建react项目,react-router-dom配置路由,引入antd

提示&#xff1a;reactrouter6.4版本&#xff0c;与reactrouter5.0的版本用法有区别&#xff0c;互不兼容需注意 文章目录 前言一、创建项目二、新建文件并引入react-router-dom、antd三、配置路由跳转四、效果五、遇到的问题六、参考文档总结 前言 需求&#xff1a;新建react项…

自动化测试平台搭建背景及记录

在目前产品的迭代过程中&#xff0c;公司现有的自动化测试体系存在很多问题&#xff0c;大多数情况是人工进行用例回归测试&#xff0c;低效且易出错&#xff0c;导致测试流程在效率和品质方面均未达到理想状态。同时&#xff0c;业务上线周期的日益缩短也导致产品质量的不稳定…

uniapp组件库Line 线条 的适用方法

目录 #平台差异说明 #基本使用 #线条类型 1.3.7 #兼容性 #API #Props 此组件一般用于显示一根线条&#xff0c;用于分隔内容块&#xff0c;有横向和竖向两种模式&#xff0c;且能设置0.5px线条&#xff0c;使用也很简单。 #平台差异说明 AppH5微信小程序支付宝小程序百…

三.逻辑架构

逻辑架构 1.逻辑架构剖析1.1服务器处理客户端请求1.2Connectors1.3 第一层&#xff1a;连接层1.4 第二层&#xff1a;服务层1.5 第三层&#xff1a;引擎层1.6存储层1.7小结 2.SQL执行流程2.1MySQL中的SQL执行流程2.2MySQL8中SQL执行原理2.3MySQL5.7中SQL执行原理2.4SQL语法顺序…

C++大学教程(第九版)6.48掷骰子游戏的改进

文章目录 题目代码运行截图 题目 (掷骰子游戏的改进)请修改图6.11 中的双游戏序允许家下赌注。 把序中运行掷骰子游戏的部分打包为一个函数。 初始化变量 bankBalance 为 1000美元。 提示玩家输入赌注数&#xff1a;wager。 利用一个 while 循环来检查 wager 是否小于或等于 b…