【C++】友元函数 ( 友元函数简介 | 友元函数声明 | 友元函数语法 | 友元函数声明不受访问控制限制 | 友元函数参数要求 )

news2024/11/20 15:13:36

文章目录

  • 一、友元函数简介
  • 二、友元函数声明
    • 1、友元函数语法
    • 2、友元函数声明不受访问控制限制
    • 3、友元函数参数要求
    • 4、友元函数示例
  • 三、完整代码示例 - 友元函数





一、友元函数简介



在 C++ 语言中 , " 友元函数 " 是 与 类 相关联的函数 ,

" 友元函数 " 不是类的成员函数 , 但是可以访问类的 private 私有成员 和 protected 保护成员 ;

友元函数可以是

  • 全局函数
  • 本类的成员函数
  • 其他类的成员函数

友元函数 是 类的 朋友 ,

在 友元函数 中 , 可以修改 类对象 中的 私有属性 和 保护属性 ;

友元函数 破坏了 类的 封装性 ;





二、友元函数声明




1、友元函数语法


" 友元函数 " 需要在 类 中进行声明 , 使用 friend 关键字修饰函数 , 语法如下 :

class ClassName {  
  
  // 成员变量和成员函数  
  
  friend returnType functionName(arguments);  
};
  • returnType : 是 友元函数 的 返回值 ;
  • functionName : 是 友元函数 的 函数名 ;
  • arguments : 是 友元函数 的 参数列表 ;

2、友元函数声明不受访问控制限制


" 友元函数 " 的 声明 , 不受类的访问控制限制 , 可以在任何地方定义 , 如 : 在 private: , protected: , public: , 下声明 友元函数 , 并不影响到 友元函数 的使用 ;

只要 声明了 " 友元函数 " , 不管在什么位置声明 , 都可以正常通过该友元函数 访问 类中的成员 ;


3、友元函数参数要求


" 友元函数 " 中 , 需要有一个参数是 类对象的 指针 ;

如下 Student 类的友元函数 , 需要有一个参数是 Student 类对象指针 , 可以访问对象 ;

private:
	// 声明友元函数 
	friend void changeAge(Student* s, int age);

4、友元函数示例


在 类中声明 如下友元函数 :

private:
	// 声明友元函数 
	friend void changeAge(Student* s, int age);

即使使用了 private 限定友元函数 , 在类的外部也能访问该函数 ;

在类的外部定义上述友元函数 , 可以访问类对象中的私有成员 ;

// 在友元函数中 访问 age 私有属性
void changeAge(Student* s, int age)
{
	s->age = age;
}




三、完整代码示例 - 友元函数



在下面的代码示例中 ,

Student 类有一个私有成员变量 age ,

并且声明了一个友元函数 changeAge ;

private:
	// 声明友元函数 
	friend void changeAge(Student* s, int age);

changeAge 函数不是 Student 的成员函数 , 而是一个 全局函数 , 通过友元关系访问 对象中的 age 私有成员 ;

在 main 函数中 , 我们创建了一个 Student 对象并调用了 changeAge 友元函数 修改私有成员 age 的值 ;


代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数
	Student(int age = 1, int height = 1)
	{
		this->age = age;
		this->height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

public:
	// 打印类数据
	void print()
	{
		cout << " age = " << age  << " , height = " << height << endl;
	}

private:
	// 声明友元函数 
	friend void changeAge(Student* s, int age);

private:
	int age;		// 年龄
	int height;		// 身高
};

// 在友元函数中 访问 age 私有属性
void changeAge(Student* s, int age)
{
	s->age = age;
}


int main() {
	
	// 调用有参构造函数 创建 Student 实例对象
	Student s(18, 180);
	s.print();

	changeAge(&s, 88);
	s.print();
	

    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
}

执行结果 :

执行 Student 的构造函数
 age = 18 , height = 180
 age = 88 , height = 180
请按任意键继续. . .

在这里插入图片描述

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

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

相关文章

【Verilog 教程】6.6Verilog 仿真激励

关键词&#xff1a;testbench&#xff0c;仿真&#xff0c;文件读写 Verilog 代码设计完成后&#xff0c;还需要进行重要的步骤&#xff0c;即逻辑功能仿真。仿真激励文件称之为 testbench&#xff0c;放在各设计模块的顶层&#xff0c;以便对模块进行系统性的例化调用进行仿真…

对象存储,从单机到分布式的演进

关于数据存储的相关知识,请大家关注“数据存储张”,各大平台同名。 通过《什么是云存储?从对象存储说起》我们对对象存储的历史、概念和基本使用有了一个大概的认识。而且我们以Minio为例,通过单机部署的模式实际操作了一下对象存储的GUI,感受了一下对象存储的用法。 在上…

word中使用latex多行公式,矩阵公式

\eqarray{H& [h(x_1)^T,\cdots,h(x_N)^T]^T \\ & [\matrix{g(w_1 x_1b_1) & \cdots & g(w_L x_1b_L) \\ \vdots & \ddots & \vdots \\ g(w_1 x_Nb_1) & \cdots & g(w_L x_Nb_L)}]_{N \times L}}&的引起的那条竖线可以通过backspace或者del…

人工智能AI 全栈体系(七)

第一章 神经网络是如何实现的 神经网络不仅仅可以处理图像&#xff0c;同样也可以处理文本。由于处理图像讲起来比较形象&#xff0c;更容易理解&#xff0c;所以基本是以图像处理为例讲解的。 七、词向量 图像处理之所以讲起来比较形象&#xff0c;是因为图像的基本元素是像…

VB6.0开发文件管理小数据库-基于ACCESS

今天的客户也是小客户&#xff0c;需要对文件的一些操作记录在数据库里面&#xff0c;这里采用的数据库ACCCESS&#xff0c;用的是VB自带的可视化数据管理器创建的mdb数据库文件。实现了数据的增删改查。简单方便。基本可以用这套代码模板实现大部分的数据库功能了。想研发或学…

自定义ElementPlus主题颜色

构建工具采用Vite CSS预处理器采用Sass 一.准备定制化的样式文件 1.安装Sass npm i sass -D 2.创建好文件目录 3.书写样式 ElementPlus默认样式. //index.scss/* 只需要重写你需要的即可 */ forward element-plus/theme-chalk/src/common/var.scss with ($colors: (prim…

腾讯云秒杀活动是什么?如何参与?

腾讯云是国内知名的云计算服务提供商之一&#xff0c;为了吸引更多的用户&#xff0c;腾讯云会不定期地推出各种各样的优惠活动&#xff0c;其中最受大家欢迎的就是“腾讯云秒杀活动”。本文将为大家详细介绍腾讯云秒杀活动参与方式以及购买攻略。 一、腾讯云秒杀活动是什么&am…

【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 操作系统 一、处理机调度基本概念二、处理机…

【论文阅读】UniDiffuser: Transformer+Diffusion 用于图、文互相推理

而多模态大模型将能够打通各种模态能力&#xff0c;实现任意模态之间转化&#xff0c;被认为是通用式生成模型的未来发展方向。 最近看到不少多模态大模型的工作&#xff0c;有医学、金融混合&#xff0c;还有CV&NLP。 今天介绍&#xff1a; One Transformer Fits All Di…

七、装饰者模式

这里写自定义目录标题 1、项目需求2、解决方案13、解决方案24、装饰者模式定义5、装饰者模式原理6、装饰者模式解决上述需求7、装饰者模式在jdk应用的源码分析 1、项目需求 2、解决方案1 3、解决方案2 可以控制类的数量&#xff0c;不至于造成很多的类在增加或者删除调料种类…

100万级连接,石墨文档WebSocket网关如何架构?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/…

自学WEB后端05-Node.js后端服务链接数据库redis

嘿&#xff0c;亲爱的小伙伴们&#xff01;&#x1f604; 今天我要给大家分享一个超级方便且高效的 NoSQL 类型数据库——Redis&#xff01;&#x1f4a1; 它可不是一般的关系型数据库哦&#xff0c;而是以键值对形式存储数据的内存数据库。&#x1f4da; 快跟着我一起来学习如…

GEO生信数据挖掘(一)数据集下载和初步观察

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 GEOquery 简介 安装并加载GEOquery包 getGEO函数获取数据&#xff08;联网下载&#xff09; 更换下载数据源 对数据集进行初步观察处理 GEOquery 简介 GEOquery是一个…

基于springboot+vue的旅游系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

如何看待程序员这个职业?

程序员作为高薪职业&#xff0c;主要是指从事程序开发、程序维护的专业人员。一般将程序员分为程序设计人员和程序编码人员&#xff0c;但两者的界限并不非常清楚&#xff0c;特别是在中国。软件从业人员分为初级程序员、中级程序员、高级程序员&#xff08;现为软件设计师&…

基于体系结构-架构真题2022(四十一)

给定关系模式R&#xff08;U,F&#xff09;&#xff0c;其中U为属性集&#xff0c;F是U上的一组函数依赖&#xff0c;那么函数依赖的公理系统中分解规则是指&#xff08;&#xff09;为F所蕴含。 解析&#xff1a; 伪传递是x到y&#xff0c;wy到z&#xff0c;则xw到z 传递是z…

【性能测试】jmeter连接数据库jdbc

一、下载第三方工具包驱动数据库   1. 因为JMeter本身没有提供链接数据库的功能&#xff0c;所以我们需要借助第三方的工具包来实现。 &#xff08;有这个jar包之后&#xff0c;jmeter可以发起jdbc请求&#xff0c;没有这个jar包&#xff0c;也有jdbc取样器&#xff0c;但不能…

服务断路器_Resilience4j信号量隔离实现

POM引入依赖 <dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-bulkhead</artifactId><version>1.7.0</version> </dependency>信号量隔离修改YML文件 resilience4j:#信号量隔离bulkhead:ins…

【数据结构】八大排序算法-代码实现+复杂度分析+稳定性分析+总结

文章目录 关于稳定性插入排序直接插入排序希尔排序 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序hoare版本挖坑法两路划分 快排致命点三路划分小区间优化 快排非递归 归并排序非递归版本 计数排序-鸽巢原理绝对映射相对映射 插入排序和选择排序的对比总结 关于稳定性 …

UNITY—2D游戏制作入门!

Unity作为当今最流行的游戏引擎之一&#xff0c;受到各大厂商的喜爱。 像是炉石传说&#xff0c;以及逃离塔克夫&#xff0c;都是由unity引擎开发制作。 作为初学者的我们&#xff0c;虽然无法直接做出完成度那么高的作品&#xff0c;但每一个伟大的目标&#xff0c;都有一个…