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//时间类
{
   //没有写访问权限,默认为private
   int 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,那么当前这个类就可以直接访问到另一个类的所有成员,提醒,另一个类课不能访问当前类的私有成员。

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


每日金句:

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

        如果没有,那就一个人!

                                                                                                                ————雀儿

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WXML模板语法-条件与列表渲染

wx:if 在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码 也可以用wx:elif和wx:else来添加else判断 <!--pages/ifIndex/ifindex.wxml--> <view wx:if"{{type 1}}">男</view> <view wx:elif"{{type …

卷积神经网络结构组成与解释

卷积神经网络结构组成与解释 卷积神经网络是以卷积层为主的深度网路结构&#xff0c;网络结构包括有卷积层、激活层、BN层、池化层、FC层、损失层等。卷积操作是对图像和滤波矩阵做内积&#xff08;元素相乘再求和&#xff09;的操作。 1. 卷积层 常见的卷积操作如下&#x…

基于Java的应急资源管理系统 (源码+文档+包运行)

一.系统概述 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本应急资源管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

Geeker-Admin:基于Vue3.4、TypeScript、Vite5、Pinia和Element-Plus的开源后台管理框架

Geeker-Admin&#xff1a;基于Vue3.4、TypeScript、Vite5、Pinia和Element-Plus的开源后台管理框架 一、引言 随着技术的不断发展&#xff0c;前端开发领域也在不断演变。为了满足现代应用程序的需求&#xff0c;开发人员需要使用最新、最强大的工具和技术。Geeker-Admin正是…

Linux 文件页反向映射

0. 引言 操作系统中与匿名页相对的是文件页&#xff0c;文件页的反向映射对比匿名页的反向映射更为简单。如果还不清楚匿名页反向映射逻辑的&#xff0c;请移步 匿名页反向映射 1. 文件页反向映射数据结构 struct file&#xff1a; 用户进程每open()一次文件&#xff0c;则会生…

分布式事务(一)

一、序言 本文介绍分布式事务相关的基本概念。 二、什么是分布式事务 分布式事务是指涉及多个独立计算机或系统的事务操作&#xff0c;这些计算机或系统可能位于不同的物理位置&#xff0c;彼此之间通过网络进行通信。分布式事务的目标是确保在分布式环境中的多个参与者之间…

物联网:门锁RNBN-K18使用记录

摘要&#xff1a;对 RNBN品牌下 K18智能门锁日常使用操作经验记录。 常见问题&#xff1a; 1.门锁联网时&#xff0c;找不到 wifi 怎么办。 答&#xff1a;检查一下几个方面&#xff1a;1. wifi 信号是否是2.4G&#xff0c;2.wifi信号是否距离没锁很远。因为门锁只能获取到2…

数据分析案例(三):基于RFM分析的客户分群

实验2 基于RFM分析的客户分群 Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢…

Alibaba --- 如何写好 Prompt ?

如何写好 Prompt 提示工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。总体而言&#xff0c;其实现逻辑如下&#xff1a; &#xff08;注&#xff1a;示例图…

PE程序底层结构与恶意代码插入与执行的研究

Windows PE程序底层结构分析 PE&#xff08;Portable Executable&#xff09;是一种Windows操作系统下可执行文件的标准格式 Windows PE程序结构和Linux的elf程序结构类似&#xff0c;首先一个名为simple64.exe程序里有一个头文件和一个段文件&#xff0c;头文件里主要存放的是…

使用Charles断点修改接口返回数据

问题&#xff1a;数量/金额原来接口是用一个字段返回&#xff0c;由于业务需要换行展示&#xff0c;后端便拆分成了两个字段&#xff0c;前端则需要用新拆分的字段去取值&#xff0c;导致目前发现有个字段的金额也取成了件数&#xff08;红框部分&#xff09;&#xff1b;需求&…

设备树下的 LED 驱动实验

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、修改设备树文件二 创建设备树节点并获取属性 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断…

有真的副业推荐吗?

#有真的副业推荐吗# 我做副业项目的时候&#xff0c;认识了一位带娃宝妈&#xff0c;讲一下她空闲时间做副业赚钱的故事吧。在一个温馨的小家庭里&#xff0c;李婷是一位全职宝妈&#xff0c;她的主要任务是照顾和陪伴自己可爱的宝宝。然而&#xff0c;随着宝宝逐渐长大&#x…

196算法之谜在 JSP 中使用内置对象 request 获取 form 表单的文本框 text 提交的数据。

(1&#xff09;编写 inputNumber . jsp &#xff0c;该页面提供一个 form 表单&#xff0c;该 form 表单提供一个文本框 text &#xff0c;用于用户输入一个正整数&#xff0c;用户在 form 表单中输入的数字&#xff0c;单击 submit 提交键将正整数提交给 huiwenNumber . jsp 页…

5.9 mybatis之callSettersOnNulls作用

文章目录 1. 当callSettersOnNullstrue时2. 当callSettersOnNullsfalse时 在mybatis的settings配置参数中有个callSettersOnNulls参数&#xff0c;官方解释为&#xff1a;指定当结果集中值为 null 的时候是否调用映射对象的 setter&#xff08;map 对象时为 put&#xff09;方法…

【菜狗学前端】ES6+笔记(包含Promise及async、await等)

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) &#xff08;免费&#xff09;菜狗学前端之ES6笔记https://download.csdn.net/download/m0_58355897/89135424 一 解构赋值 解构赋值 解构指的是把一个数据…

2024年广东省网络系统管理样题第3套网络部署部分

2024年广东省网络系统管理样题第3套网络部署部分 模块A&#xff1a;网络构建 极安云科专注职业教育技能培训4年&#xff0c;包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点&#xff0c;提供完整全面的系统性理论教…

Bridge 桥接

意图 将抽象部分与其显示部分分离&#xff0c;使他们都可以独立地变化。 结构 其中&#xff1a; Abstraction定义抽象类的接口&#xff0c;维护一个指向Implementer类型对象的指针。RefinedAbstraction扩展由Abstraction定义的接口。Implementor定义实现类的接口&#xff0c…

并发编程之ThreadLocal使用及原理

ThreadLocal主要是为了解决线程安全性问题的 非线程安全举例 public class ThreadLocalDemo {// 非线程安全的private static final SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static Date parse(String strDate) throws ParseExc…

Spring源码刨析之配置文件的解析和bean的创建以及生命周期

public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…