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.rhkb.cn/news/304786.html

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

相关文章

网络IO模型以及实际应用

网络IO模型 本文主要介绍了几种不同的网络IO模型&#xff0c;以及实际应用中使用到的Reactor模型等。 我们常说的网络IO模型&#xff0c;主要包含阻塞IO、非阻塞IO、多路复用IO、信号驱动IO、异步IO。 根据第一个阶段&#xff1a;是否需要阻塞&#xff0c;分为阻塞和非阻塞IO。…

【从浅学到熟知Linux】进程状态与进程优先级(含进程R/S/T/t/D/X/Z状态介绍、僵尸进程、孤儿进程、使用top及renice调整进程优先级)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程及数据库等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 进程状态进程状态查看R运行状态&#xff08;running&#xff09;S睡眠状态&#xff08;sleeping&a…

GT收发器64B66B协议(2)自定义PHY设计

文章目录 前言一、设计框图二、GT_module三、PHY_module3.1、PHY_tx模块3.2、PHY_rx_bitsync模块3.3、PHY_rx模块 四、上板测试总结 前言 有了对64B66B协议的认识以及我们之前设计8B10B自定义PHY的经验&#xff0c;本文开始对64B66B自定义PHY的设计 一、设计框图 二、GT_modu…

Harmony鸿蒙南向驱动开发-UART

UART指异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个UART设备的连接示意图如下&#xff0c;UART与其他模块一般用2线&a…

数据结构初阶:栈和队列

栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。…

为什么每个人都需要了解这些数据加密技术?

在数字时代&#xff0c;数据加密技术不仅对保护企业的商业秘密至关重要&#xff0c;也是个人隐私安全的重要屏障。随着技术的进步和网络犯罪的增加&#xff0c;数据加密已经成为了信息安全领域的一个热点议题。以下是探讨为什么每个人都需要了解这些数据加密技术的几个主要原因…

SpringBoot启动时banner设置

SpringBoot启动时banner设置 1.操作步骤2.各种banner图像 1.操作步骤 在application.properties文件中设置新的banner对于的文件位置&#xff0c;最好放在resources目录下 spring.banner.locationbanner.txt2.各种banner图像 &#xff08;1&#xff09;经典大佛图 具体txt文…

[通俗易懂]《动手学强化学习》学习笔记2-第2、3、4章

文章目录 前言小总结&#xff08;前文回顾&#xff09;第二章 多臂老虎机2.2.2形式化描述 第三章 马尔可夫决策过程3.6 占用度量 代码3.6 占用度量 定理2 第四章 动态规划算法4.3.3 策略迭代算法 代码 总结 前言 参考&#xff1a; 《动手学强化学习》作者&#xff1a;张伟楠&a…

为什么要部署IP SSL证书?怎么申请?

我们需要知道什么是IP SSL证书。SSL&#xff0c;全称为Secure Sockets Layer&#xff0c;即安全套接层&#xff0c;是为网络通信提供安全及数据完整性的一种安全协议。而IP SSL证书就是基于SSL协议的一种证书&#xff0c;它能够为网站和用户的数据传输提供加密处理&#xff0c;…

Prometheus-Grafana基础篇安装绘图

首先Prometheus安装 1、下载 https://prometheus.io/download/ 官网路径可以去这儿下载 2、如图&#xff1a; 3.解压&#xff1a; tar -xf prometheus-2.6.1.linux-amd64 cd prometheus-2.6.1.linux-amd64 4.配置文件说明&#xff1a; vim prometheus.yml 5.启动Promethe…

OpenHarmony NAPI 框架生成工具实现流程

NAPI 框架生成工具 可以根据用户指定路径下的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。在开发 JS 应用与 NAPI 间接口时&#xff0c;底层框架开发者无需关注 Nodejs 语法、C 与 JS 之间的数据类型转换等上层应用转换逻辑&#xff0c;只关注底…

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

2014-Convolutional Neural Network-based Place Recognition

Qt plugin 开发UI界面插件

目录 1.创建接口 2.创建插件 3.创建插件界面 4.插件实现 5.创建应用工程 6.应用插件 1.创建接口 打开QtCreater&#xff0c;点击左上角“文件”->新建文件或项目&#xff0c;在弹窗中选择C/CHeader File。 输入文件名&#xff0c;选好路径&#xff08;可自行设置名称…

Golang | Leetcode Golang题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…

BM96 主持人调度(二)(贪心算法)

一开始写的时候忘了给start、end数组赋值了 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 计算成功举办活动需要多少名主持人* param n int整型 有n个活动* param start…

Qt——示波器/图表 QCustomPlot

一、介绍 QCustomPlot是一个用于绘图和数据可视化的Qt C小部件。它没有进一步的依赖关系&#xff0c;提供友好的文档帮助。这个绘图库专注于制作好看的&#xff0c;出版质量的2D绘图&#xff0c;图形和图表&#xff0c;以及为实时可视化应用程序提供高性能。QCustomPlot可以导出…

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…

浅谈一下数据接口怎么方便我们的工作

最近一段时间&#xff0c;一直在折腾自己工作上面的一些事情&#xff0c;这几天终于稍微闲下来去做一份表格。 这份表格是基于一款游戏的数据接口去做一个动态的运算&#xff0c;核算出相关的利润率等等的数据。那么我们今天来具体聊聊Excel的获取数据功能。 现在比较多应用都…

VUE3和SpringBoot实现ChatGPT页面打字效果SSE流式数据展示

在做这个功能之前&#xff0c;本人也是走了很多弯路&#xff08;花了好几天才搞好&#xff09;&#xff0c;你能看到本篇博文&#xff0c;那你就是找对地方了。百度上很多都是使用SseEmitter这种方式&#xff0c;这种方式使用的是websocket&#xff0c;使用这种方式就搞复杂了&…

Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)

一、项目简介 本项目是一套基于SSM框架实现的人力资源管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…