【C++】C++中的友元函数详解

目录

一.友元函数介绍

二.友元函数的使用场景

三.友元函数的注意事项


一.友元函数介绍

友元函数(Friend Function)是C++中的一个特殊概念,它允许非成员函数访问类的私有(private)和保护(protected)成员。这在某些情况下非常有用,尤其是当你想要实现某些操作,而这些操作需要访问类的内部数据,但又不想让这些操作成为类的成员函数时。

1.友元函数的特点

  1. 非成员:友元函数不是类的成员函数,因此它的语法定义与普通函数相同。
  2. 访问权限:友元函数可以访问类的所有成员,包括私有和保护成员。
  3. 声明方式:在类的定义中,通过friend关键字声明友元函数。
  4. 类的作用域外:友元函数的定义通常在类的作用域之外。

2.友元函数的声明和定义示例

在这个例子中,getSecretValue是一个友元函数,它可以访问MyClass类的私有成员secretValue。即使getSecretValue不是MyClass的成员函数,它仍然能够访问类的私有数据。

class MyClass {
private:int secretValue;public:MyClass(int value) : secretValue(value) {}// 声明友元函数friend int getSecretValue(const MyClass& obj);
};// 友元函数的定义
int getSecretValue(const MyClass& obj) {return obj.secretValue; // 直接访问私有成员
}int main() {MyClass myObject(42);cout << "Secret Value: " << getSecretValue(myObject) << endl;return 0;
}

二.友元函数的使用场景

在C++中,友元函数是一种特殊的非成员函数,它拥有访问类的私有(private)和保护(protected)成员的权限。使用友元函数主要有以下几种情况:

1. 需要访问类的私有数据:

如果一个函数需要访问类的私有成员,但又不想让这个函数成为类的成员函数,这时可以将其声明为友元函数。

2. 辅助函数:

当一个函数在逻辑上与类紧密相关,但作为成员函数不合适时,例如,一些工具函数或辅助函数。

3. 重载运算符:

在C++中,运算符重载通常需要访问类的私有成员,因此它们常常被声明为类的友元函数。

4. 多个类之间的协作:

当两个或多个类需要共享某些私有或保护成员,而这些成员不应该被类的外部访问时,可以将需要访问这些成员的类的成员函数或非成员函数声明为友元。

5. 类模板实现:

在模板类中,有时需要友元函数来访问模板参数的私有成员。

6. 优化性能:

如果一个成员函数的实现可以简化为一个非成员函数,并且这个非成员函数需要访问类的私有数据,可以将其声明为友元函数来避免成员函数的调用开销。

7. 继承中的访问问题:

在某些继承结构中,派生类可能需要访问基类的私有成员,这时可以将派生类的构造函数或特定的成员函数声明为基类的友元。
友元函数的声明方式通常是在类的定义中使用 friend 关键字,例如:

class MyClass {private:int privateData;public:MyClass(int data) : privateData(data) {}friend void accessPrivateData(MyClass& obj);};void accessPrivateData(MyClass& obj) {// 这个函数可以访问obj的privateDatastd::cout << obj.privateData << std::endl;}

三.友元函数的注意事项

  • 友元函数的声明必须在类的内部进行。
  • 友元关系不可传递。也就是说,如果一个函数是A类的友元,并不意味着它自动成为B类的友元,即使B类中有类似的友元声明。
  • 友元函数不享有类的成员函数所具有的一些特权,比如隐式地访问this指针。
  • 过度使用友元函数可能会破坏封装性,因此应当谨慎使用。

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

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

相关文章

Laravel生成二维码图片

Laravel生成二维码图片 composer下载组件 https://github.com/SimpleSoftwareIO/simple-qrcode/tree/develop/docs/zh-cn composer require simplesoftwareio/simple-qrcode "~2"namespace App\Http\Controllers;use SimpleSoftwareIO\QrCode\Facades\QrCode;cla…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

代理IP如何选以及常见反爬策略 为什么需要代理&#xff1f; 因为有的网站会封IP&#xff0c;用户如果没有登录&#xff0c;那IP就是身份标识&#xff0c;如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求&#xff0c;帮你转交的人对面不熟&a…

【机器学习】线性判别分析(LDA):从理论到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 线性判别分析&#xff08;LDA&#xff09;&#xff1a;从理论到实践LDA的基本概…

c++ - 多态

文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念 1、概念&#xff1a; 多态就是具有多种形态&#xff0c;可以理解为同一个行为不同对象去完成表现出不同的状态&#xff0c;如&#xff1a; 二、多态使用 1、构成多态的条件 &#xff08;1&#xff09;派…

SpringCloud01_技术选型、生态底层、整合knife4j - swagger3、支付模块、订单模块、热部署Devtools(开发阶段)

文章目录 ①. 从Boot和Cloud版本选型②. SpringCloud生态底层③. 整合knife4j - swagger3④. 父工程项目搭建⑤. 支付微服务 - 8001⑥. 订单微服务 - consumer80⑦. 热部署Devtools(开发阶段)⑧. 测试Run DashBord ①. 从Boot和Cloud版本选型 ①. 结论:本次Java、cloud、boot…

程序的控制结构——switch语句【互三互三】

文章目录 &#x1f341; 引言 &#x1f341;1.语句格式&#xff1a; &#x1f341;2.语句执行过程 &#x1f341;3.语句格式举例 &#x1f341;例题 &#x1f449;【例1】 &#x1f680;示例代码 &#x1f449;【例2】 &#x1f680;【分析】 &#x1f680;示例代码…

【企业级监控】Zabbix实现邮箱报警

Zabbix监控自动化 文章目录 Zabbix监控自动化资源列表基础环境前言四、Zabbix邮件告警4.1、实现报警所需的条件4.1.1、告警媒介4.1.2、触发器&#xff08;trigger&#xff09;4.1.3、动作&#xff08;action&#xff09; 4.2、配置告警媒介4.2.1、设置告警媒介参数4.2.2、启用此…

卡码网KamaCoder 99. 岛屿数量

题目来源&#xff1a;99. 岛屿数量 C题解&#xff1a;来源代码随想录 懒得自己写了。直接搬运。。。 1. 深度优先搜索&#xff1a;它的循环在main函数里&#xff0c;遍历每个位置&#xff0c;判断 是否为陆地 及 是否访问过。 #include <iostream> #include <vecto…

docker 安装orcale11数据库

初次安装流程 1.拉取 oracle 11g 镜像&#xff08;有6g&#xff0c;要等较长的时间&#xff09;: docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g2.执行以下命令以创建并运行 Oracle 11g 容器&#xff08;其中&#xff1a;30026为映射主机端口&#xff0…

Python学习1---深浅拷贝

在Python中&#xff0c;当我们复制对象时&#xff0c;有两种主要的方式&#xff1a;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;。 一、浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝创建一个新对象&#xff0c;但是它包含的…

[1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)

电商智能助手进化论:AI Agent技术引领下的智能化升级与实战效果评估 1.LLM Agent 的整体概述 1.0 Agent 在学术界的热度持续攀升 人工智能应用的几个阶段LLM Agent 的构成要素 语言模型 (LLM) 仅限于它们所训练的知识,并且这些知识很快就会过时。且 LLM 具备以下缺点: 会产…

PG大会周五于杭州举办;Pika发布4.0;阿里云MySQL上线Zero-ETL集成能力

重要更新 1. PostgreSQL中国技术大会举行12日&#xff08;周五&#xff09;于杭州举办&#xff0c;是PostgreSQL社区年度的大会&#xff0c;举办地点&#xff1a;杭州君尚云郦酒店&#xff08;杭州市上城区临丁路1188号&#xff09;&#xff0c;感兴趣的可以考虑现场参加 ( [1]…

【公益案例展】华为云X《无尽攀登》——攀登不停,向上而行

‍ 华为云公益案例 本项目案例由华为云投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 夏伯渝&#xff0c;中国无腿登珠峰第一人&#xff0c;一生43年…

Guava LocalCache源码分析:LocalCache生成

Guava LocalCache源码分析&#xff1a;Cache生成 版本LocalCache参数说明Cache构建过程LocalCache介绍LocalCache实例化将builder中的属性赋值到LocalCache中分段 LocalCache为guava本地缓存的解决方案&#xff0c;提供了基于容量&#xff0c;时间和引用的缓存回收方式&#xf…

目标检测大揭秘:算法种类与优劣分析

目标检测大揭秘&#xff1a;算法种类与优劣分析&#x1f50d; 在当今这个信息爆炸的时代&#xff0c;图像识别技术正逐渐成为我们生活中不可或缺的一部分。目标检测作为图像识别领域的重要分支&#xff0c;已经广泛应用于安全监控、自动驾驶、智能家居等多个领域。今天&#x…

算法复杂度<数据结构 C版>

什么是算法复杂度&#xff1f; 简单来说算法复杂度是用来衡量一个算法的优劣的&#xff0c;一个程序在运行时&#xff0c;对运行时间和运行空间有要求&#xff0c;即时间复杂度和空间复杂度。 目录 什么是算法复杂度&#xff1f; 大O的渐近表达式 时间复杂度示例 空间复杂度…

Python向某个网页发起请求

在Python中&#xff0c;向某个网页发起请求最常用的库是requests。该库简单易用&#xff0c;支持HTTP的GET、POST、PUT、DELETE等方法。以下是如何使用requests库向网页发起请求的例子&#xff1a; 首先&#xff0c;你需要确保安装了requests库。如果你还没有安装&#xff0c;…

Jenkins 离线升级

1. 环境说明 环境 A: jenkins 版本&#xff1a;2.253使用 systemctl 管理的 jenkins 服务 环境 B&#xff1a; 可以上网的机器&#xff0c;装有 docker-compose docker 和 docker-compose 安装&#xff0c;这里都略了。 2. 安装旧版本 2.1 环境 A jenkins 目录打包文件 …

2024辽宁省大学数学建模竞赛试题思路

A题 (1) 建立模型分析低空顺风风切变对起飞和降落的影响 模型假设 飞机被视为质点&#xff0c;忽略其尺寸和形状对风阻的影响。风切变仅考虑顺风方向的变化&#xff0c;忽略其他方向的风切变。飞机的飞行速度、高度和姿态&#xff08;如迎角、俯仰角&#xff09;是变化的&am…

(补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式

文章目录 前言一、进制1 逢几进一2 常见进制在java中的表示3 进制中的转换(1)任意进制转十进制(2)十进制转其他进制二、计算机中的存储1 计算机的存储规则(文本数据)(1)ASCII码表(2)编码规则的发展演化2 计算机的存储规则(图片数据)(1)分辨率、像素(2)黑白图与灰度…