c++的友元函数,详细笔记,细说三种友元用法

解释友元

友元用通俗易懂的话来说,就是:当有人来到你家里,他就只能呆在客厅里面,你是不可能让他来到你的卧室之中的。但是如果这个人是你的朋友,那么你是默许他可以进入你的卧室的。

此时呢?我告诉你,这些分别是什么意思

外来人:普通函数

你家:所在的类

客厅:公有部分

卧室:私有部分

如果这个外来人是朋友:友元函数(只需要加上friend关键字即可),他是可以访问你的私有部分也就是卧室的,但是普通的外来人是不允许的!

什么是友元函数?

首先,了解友元函数之前,我们来想一想类内函数(成员函数)和类外函数有何区别。一,类内函数可以访问类的私有成员,并且自带一个this指针指向成员函数所指向的某一对象。二,类外函数,无法访问类的私有成员,且不带this指针。

比如,如果类内的成员函数我们在调用的时候一定是:对象.函数()这样调用,这就要求了这个函数的第一个,一定是这个对象(这个知识点,我们在后面运算符重载里面讲解),而友元函数是什么?

友元函数和普通的函数并无区别,也没有this指针。怎么做呢?接下来来讲讲:

1 友元函数可以访问一个类的私有成员,而其他的函数是无法访问的

2 他可以不属于任何类的普通函数,也可以是另一个类的成员函数。

怎么声明:

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

#include<iostream>
using namespace std;class Date  //日期类
{
private:int year; //年int month;//月int day;//日
public:Date(int y, int m, int d) :year(y), month(m), day(d){}void show(){cout << year << "-" << month << "-" << day << endl;}//声明modifyDate是自己(Date类)的友元,可以访问自己的私有成员friend void modifyDate(Date& date, int year, int month, int day);
};void modifyDate(Date& date, int year, int month, int day)
{   //是Date的友元函数,可以访问date的私有数据date.year = year;date.month = month;date.day = day;//date.show();
}int main()
{Date today{ 2024,1,23 };today.show();modifyDate(today, 2023, 10, 1);today.show();return 0;
}

这里我们定义了一个友元函数,我们在类外写的时候,就像正常写自定义函数一样,该怎么写就怎么写,只不过声明的时候,我们需要在类内声明,并在最前面加上friend,就完了。

第二种友元:


class Date//日期类
{
private:int year;int month;int day;
public:Date(int y, int m, int d) :year(y), month(m), day(d){}void Calcutetime(const Time& t);//统计当前日期时间(包括日期和时间)是当年第几秒
};class Time//时间类
{//没有写访问权限,默认为privateint hour;int minute;int second;
public:Time(int h, int m, int s) :hour(h), minute(m), second(s){}friend void Date::Calcutetime(const Time& t); //友元函数
};

这里我们直接上代码,我没有去实现函数的能力,只是做一个演示。首先我们在Date类里面写了一个成员函数,但是我们想通过这个成员函数去访问另一个类,也就是Time类的私有成员。我们就只需要在Time类里面,把这个函数在Time里面声明,并加上friend。如此一来,Date就可以直接访问Time类的私有成员了。和第一种大差不差。我们继续

第三种友元函数:


友元类
class Date //日期类
{
private:int year;int month;int day;
public:Date(int y, int m, int d) :year(y), month(m), day(d){}friend class DateFriend; //友元类,DateFriend是自己(Date类)的友元类
};class DateFriend//这个类是可以访问Date类的私有成员的
{
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的私有成员date.year = year;date.month = month;date.day = day;
}
void DateFriend::show(const Date& date)
{//友元类,可以直接访问date的私有成员cout << date.year << "-" << date.month << "-" << date.day << endl;
}

这个就更简单明了,直接在另一个类中写上当前类的friend,那么当前这个类就可以直接访问到另一个类的所有成员,提醒,另一个类课不能访问当前类的私有成员。

就类似于,你认为他是你的朋友,你允许他访问你的卧室,但是你这么认为他不这么认为,他不觉得你是他的朋友,自然不允许你访问他的私有成员。


每日金句:

        找一个志同道合,步伐一致的人同行。

        如果没有,那就一个人!

                                                                                                                ————雀儿

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

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

相关文章

SpringBoot+Vue,轻松实现网页版人脸登录与精准识别

目录 1、技术介绍 2、技术原理 2.1、人脸检测 ①参考模板法 ②人脸规则法 2.2、人脸跟踪 2.3、人脸比对 ①特征向量法 ②面纹模板法 识别过程 案例 一、springboot后端项目 1&#xff0c;拉取项目后&#xff0c;导入相关依赖jar包 2&#xff0c;执行sql文件夹下面…

智能运维场景 | 科技风险预警,能实现到什么程度?

[ 原作者&#xff1a;擎创夏洛克&#xff0c;本文略做了节选和改编 ] 每次一说到“风险预警”&#xff0c;就会有客户问我们能做怎样的风险预警。实际上在智能运维厂商来说&#xff0c;此风险非彼风险&#xff0c;不是能做银行的业务上的风险预警&#xff08;比如贷款风险等&a…

golang的引用和非引用总结

目录 概述 一、基本概念 指针类型&#xff08;Pointer type&#xff09; 非引用类型&#xff08;值类型&#xff09; 引用类型&#xff08;Reference Types&#xff09; 解引用&#xff08;dereference&#xff09; 二、引用类型和非引用类型的区别 三、golang数据类型…

深度学习500问——Chapter07:生成对抗网络(GAN)(1)

文章目录 7.1 GAN基本概念 7.1.1 如何通俗理解GAN 7.1.2 GAN的形式化表示 7.1.3 GAN的目标函数是什么 7.1.4 GAN的目标函数和交叉熵有什么区别 7.1.5 GAN的Loss为什么降不下去 7.1.6 生成式模型、判别式模型的区别 7.1.7 什么是mode collapsing 7.1.8 如何解决mode collapsing …

论文| Convolutional Neural Network-based Place Recognition - 2014

2014-Convolutional Neural Network-based Place Recognition

PID c++算法学习和实现

原理图&#xff1a; &#xff08;1&#xff09;位置式PID 是1&#xff1a;当前系统的实际位置&#xff0c;与你想要达到的预期位置的偏差&#xff0c; 2&#xff1a;进行PID控制,误差会一直累加&#xff0c;会使当前输出与过去的所有输入相关&#xff0c;输入uk出错&#xff…

为什么别人能拿到大厂offer?你应该明白这些java面试技巧!

言简意赅的说明自己的工作时间&#xff0c;擅长技术栈和自己的工作预期。 注意准备两份自我介绍&#xff0c;一个是跟面试官说的&#xff0c;一个是跟HR说的。 项目经验介绍 选一个自己感觉是最成功的&#xff0c;而且还是最有把握的项目&#xff0c;讲给面试官。 简单说下…

Lvgl9 WindowsSimulator Visual Studio2017

因为在操作过程中遇到了一些错误&#xff0c;所以将操作及解决问题的过程记录下来。 一、下载lv_port_pc_visual_studio github链接:GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux su…

Linux系统使用Docker部署MeterSphere并实现公网访问本地测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

JavaWeb的简单了解

一、什么是JavaWeb 1. JavaWeb&#xff1a;是使用jsp和JavaBean技术开发动态网站的 2.是什么动态网站 和html的区别在哪&#xff1a;thml开发的网站只能在你自己电脑上访问其他人可以访问 3.那怎么开发JavaWeb&#xff1a;我们首先需要eclipse还需要Tomcat 小tips&am…

跨站请求伪造漏洞(CSRF)

什么是CSRF CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;即跨站请求伪造攻击。 漏洞原理 跨站请求伪造漏洞的原理主要是利用了网站对用户请求的验证不严谨。攻击者会在恶意网站中构造一个…

正信法律:老板一直拖欠工资怎么办

在职场中&#xff0c;薪酬是劳动者辛勤工作的直接回报&#xff0c;然而不幸的是&#xff0c;拖欠工资的现象时有发生。面对老板一直拖欠工资的困境&#xff0c;员工应采取一系列明智而有效的措施来维护自己的合法权益。 与雇主进行沟通。清晰、冷静地表达自己的诉求&#xff0c…

电脑怎么下载微信小程序的视频

电脑怎么下载微信小程序中的视频资源&#xff0c;本篇文章就教大家如何下载微信小程序的视频资源的方法&#xff0c;这里要借助一个工具:下载高手 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w6DWf-9Nxw?pwdl09r 提取码&#xff1a;l09r --来自百度网盘…

个人在线要饭网站源码

源码简介 施舍也要讲究便捷&#xff0c;如果能像购物一样&#xff0c;那也是很美的一件事情&#xff1b; 接入了支付宝当面付系统. 安装环境 php5.6 Nginx 安装教程 1.上传源码压缩包到网站目录并解压即可 2.支付配置 /修改文件 app/config.php /*** 请填写以下配置信…

互联网大厂ssp面经之路:计算机网络part1

1. 计算机网络的组成部分有哪些&#xff1f; a. 硬件设备&#xff1a;计算机网络由各种硬件设备组成&#xff0c;包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接&#xff08;如网线、光纤&#xff09;相互连接。 b. 协议&#xff1a;计算机网络中的通信需…

vue商城项目vue shop vite

Vue Shop 是一个基于 Vue.js 框架构建的电子商务平台&#xff0c;它利用了 Vue 的响应式数据绑定和组件化的特点&#xff0c;为用户提供了一种快速开发和部署在线商店的解决方案。Vite 是一种现代化的前端构建工具&#xff0c;它提供了快速的冷启动、即时模块热更新&#xff08…

数据安全之路:Databend 用户与角色管理应用

Databend 目前支持基于角色的访问控制 (RBAC) 和 自主访问控制 (DAC) 模型&#xff0c;用于访问控制功能。 通过本指南&#xff0c;我们会了解权限和角色在 Databend 中的基本概念&#xff0c;以及如何管理角色、继承角色与建立层级、设置默认角色以及所有权的重要性。这些功能…

springboot-开源项目-追踪法-简单有效,从F12到SQL数据库表

使用的技术栈&#xff1a;springbootmybatis&#xff0c;edge浏览器 插件&#xff1a;MybatisX 第一步&#xff1a; 按F12,选择网络 第二步&#xff1a; 进入IDEA编辑器&#xff0c;键盘按两次shift键&#xff0c;点击第一个&#xff0c;快速定位到该操作 3&#xff1a; 我…

解码rmallox勒索病毒:深入了解与全面应对这一网络威胁

随着科技的不断发展&#xff0c;我们的生活已经与数字世界紧密相连。然而&#xff0c;这种紧密的联系也带来了新的安全隐患&#xff0c;其中勒索病毒就是近年来网络安全领域的一个突出问题。特别是rmallox勒索病毒&#xff0c;它以其独特的加密性和破坏性&#xff0c;给全球范围…

一起找bug之购物

如果不是购物车满了&#xff0c;大概都不会发现这个 bug 淘宝 APP 修复了购物车满的情况下&#xff0c;往里面添加新商品时&#xff0c;会把一个老商品移入收藏夹&#xff0c; 但是如果这个老商品是已失效状态&#xff0c;就无法自动移入收藏夹&#xff0c;而且会一直在购物车…