C++中的‘friend‘关键字

目录

友元函数(Friend Function)

友元类(Friend Class)

友元函数模板(Friend Function Template)

友元类模板(Friend Class Template)

总结


摘要

在 C++ 中,`friend` 关键字用于声明一个函数或类为另一个类的友元,这样该函数或类可以访问这个类的私有成员和保护成员。友元机制提供了一种在保持数据封装的同时允许某些外部函数或类访问私有数据的方法。主要包含友元函数、友元类、友元函数模板、友元类模板。

友元函数(Friend Function)

友元函数是一个被指定为友元的非成员函数,它能够访问类的私有成员和保护成员。

声明和定义友元函数

// `display` 函数被声明为 `MyClass` 的友元,因此它可以访问 `MyClass` 的私有成员 `value`
#include <iostream>class MyClass {
public:MyClass(int val) : value(val) {}// 声明 friend 函数friend void display(const MyClass& obj);private:int value;
};// 定义 friend 函数
void display(const MyClass& obj) {std::cout << "Value: " << obj.value << std::endl;
}int main() {MyClass obj(10);display(obj); // 输出: Value: 10return 0;
}

友元类(Friend Class)

友元类是一个被指定为友元的类,这样该类的所有成员函数都可以访问另一个类的私有成员和保护成员。

声明友元类

// 类 `B` 被声明为类 `A` 的友元,因此 `B` 类中的成员函数 `showAValue` 可以访问 `A` 的私有成员 `value`
#include <iostream>class B; // 前向声明class A {
public:A(int val) : value(val) {}// 声明 B 为友元类friend class B;private:int value;
};class B {
public:void showAValue(const A& obj) {std::cout << "A's value: " << obj.value << std::endl;}
};int main() {A a(20);B b;b.showAValue(a); // 输出: A's value: 20return 0;
}

友元函数模板(Friend Function Template)

我们可以将函数模板声明为友元,使得该模板实例化的每个函数都可以访问类的私有成员和保护成员。

声明友元函数模板

// `showValue` 函数模板被声明为 `MyClass` 类模板的友元,因此它可以访问 `MyClass` 的私有成员 `value`
#include <iostream>template <typename T>
class MyClass;template <typename T>
void showValue(const MyClass<T>& obj);template <typename T>
class MyClass {
public:MyClass(T val) : value(val) {}// 声明友元函数模板friend void showValue<>(const MyClass<T>& obj);private:T value;
};template <typename T>
void showValue(const MyClass<T>& obj) {std::cout << "Value: " << obj.value << std::endl;
}int main() {MyClass<int> obj(30);showValue(obj); // 输出: Value: 30return 0;
}

友元类模板(Friend Class Template)

我们也可以将类模板声明为友元,使得该模板实例化的每个类都可以访问另一个类的私有成员和保护成员。

声明友元类模板

// 类模板 `B` 被声明为类模板 `A` 的友元,因此 `B` 类模板的实例化对象可以访问 `A` 类模板的私有成员 `value`
#include <iostream>template <typename T>
class B;template <typename T>
class A {
public:A(T val) : value(val) {}// 声明友元类模板friend class B<T>;private:T value;
};template <typename T>
class B {
public:void showAValue(const A<T>& obj) {std::cout << "A's value: " << obj.value << std::endl;}
};int main() {A<int> a(40);B<int> b;b.showAValue(a); // 输出: A's value: 40return 0;
}

总结

1. 友元破坏封装:友元函数和友元类破坏了类的封装性,因为它们可以访问类的私有成员和保护成员,所以我们要谨慎使用友元机制。
2. 友元关系单向性:友元关系是单向的。如果类 `A` 是类 `B` 的友元,类 `B` 不能自动成为类 `A` 的友元,除非也明确声明。
3. 不能继承友元关系:友元关系不能被继承。如果基类将一个函数或类声明为友元,派生类不会自动继承这种友元关系。
4. 滥用友元:避免滥用友元机制。如果大量使用友元,可能需要重新考虑类的设计,确保类的职责分明和接口的合理性。

友元机制在 C++ 中提供了一种在保持数据封装的同时允许某些外部函数或类访问私有数据的方法,应谨慎使用以避免破坏类的封装性和增加代码的复杂性。

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

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

相关文章

英伟达算力芯片为什么能够“一统天下”

英伟达算力芯片能够一统天下&#xff0c;主要归因于以下几个关键因素&#xff1a; 技术创新与产品优势&#xff1a; 英伟达自1993年成立以来&#xff0c;一直在GPU和AI芯片领域进行持续的技术创新。特别是随着深度神经网络技术的突破&#xff0c;英伟达借助CUDA平台在人工智能…

湖南源点(市场研究)咨询 有效的市场调研是商业定位的基础

本文由湖南&#xff08;市场调研&#xff09;源点咨询编辑发布 近20年&#xff0c;中国购物中心井喷式的发展&#xff0c;经营面积几何倍的增长&#xff0c;但在现今竞争如此激烈的商业环境中&#xff0c;消费者的消费信心不足&#xff0c;购物中心同质化严重&#xff0c;经营…

C语言题目:求具有abcd=(ab+cd)^2性质的四位数

题目描述 3025这个数具有一种独特的性质&#xff1a;将它平分为二段&#xff0c;即30和25&#xff0c;使之相加后求平方&#xff0c;即(3025)2&#xff0c;恰好等于3025本身。请求出具有这样性质的全部四位数 输入格式 无 输出格式 满足题意的数全部四位数(从小到大输出,且…

mybatis执行自定义sql

背景 在开发过程中遇到一个需求&#xff1a;希望从数据库中读取预先定义好的sql&#xff0c;根据传参进行参数预处理后执行sql语句。结合项目实际情况我决定使用mybatis执行预定义sql。 实现过程 缓存我们自定义的sql语句 MappedStatement ms new MappedStatement.Builder(co…

flyfish3.0.0配置避坑

1.基础环境准备篇 doc/01-基础环境准备篇.md 云智慧/FlyFish - Gitee.com 使用教程里给出的java环境时&#xff0c;可以显示java版本&#xff0c;但是不能显示Maven的版本 改为&#xff1a; export NODE_HOME/usr/local/node/node-v14.19.3-linux-x64 export PATH$NODE_HOME…

【面试题-006】java中的垃圾回算法有哪些?

Java中的垃圾回收&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;是指自动内存管理的一种机制&#xff0c;用于回收不再使用的对象占用的内存。Java中的垃圾回收算法主要有以下几种&#xff1a; 标记-清除&#xff08;Mark-Sweep&#xff09;算法&#xff1a; …

WebSocket 断网重连、心跳检测功能封装

文章目录 简介特点优缺点使用场景 用法封装断网重连心跳检测 注意 简介 WebSocket是一种用于在Web浏览器和服务器之间进行双向通信的协议。它提供了一种在单个TCP连接上进行持久化的全双工通信能力。WebSocket协议通过在HTTP握手阶段升级到WebSocket连接&#xff0c;从而允许双…

100页2秒?我们为什么需要这样的文档解析速度

近期&#xff0c;TextIn通用文档解析完成最新一版产品迭代&#xff0c;将100页文档解析速度提升至最快2秒以内。 P50&#xff08;百页&#xff09; P90&#xff08;百页&#xff09; P95&#xff08;百页&#xff09; P99&#xff08;百页&#xff09; 平均&#xff08;单页…

记某网关系统通用漏洞的挖掘

前言 本篇文章分享一下通用漏洞挖掘的过程&#xff0c;想要获得通用漏洞证书&#xff0c;首先要求是中危及中危以上的通用型漏洞且所属公司的注册资本大于5000万。挖掘一个漏洞其实不难&#xff0c;个人觉得是目标公司资产的搜集。访问CNVD平台发现某网关系统被师傅提交过任意…

陈文自媒体:人生的管道收入,你搭建了几条?

今天不讲行业的内容&#xff0c;今天说说一下人生的一些规划&#xff0c;可能有人说&#xff0c;现在社会变化这么快&#xff0c;谈啥规划&#xff0c;那不是笑话嘛&#xff1f; 其实我想说&#xff0c;提前规划比没有规划&#xff0c;效果完全不一样&#xff0c; 是的社会变化…

V神的傲慢与偏见

原创 | 刘教链 隔夜BTC&#xff08;比特币&#xff09;小幅回升至5日线67.7k附近。前日5.31教链内参“美核心通胀放缓&#xff0c;利好宽松周期落地”[链接]提到&#xff0c;以太坊创始人Vitalik Buterin&#xff08;V神&#xff09;新发表了一篇长文&#xff0c;主题是关于他“…

Java反射机制:深入探讨与实际应用

Java反射机制&#xff1a;深入探讨与实际应用 引言 反射机制是Java语言的重要特性之一&#xff0c;它允许程序在运行时检查和操作自身的结构。通过反射&#xff0c;开发者可以在运行时动态地获取类的详细信息&#xff0c;创建对象&#xff0c;调用方法&#xff0c;甚至修改字…

H6911 DC2.6-40V升压IC 升24V36V48V60V80V100V10A数转模无频闪LED芯片

H6911 DC2.6-40V升压IC是一款升压恒流LED恒流驱动器&#xff0c;具有多种特点&#xff0c;适用于多种的LED照明应用领域。以下是关于该产品的详细解释&#xff1a; 一、产品概述 H6911是一款专为LED照明设计的升压恒流驱动器。它能在2.6至40V的宽电压范围内稳定工作&#xff0c…

性能优化随笔(一)

在软件开发过程中&#xff0c;一般要先实现功能方面的需求&#xff0c;功能方面的需求开发完毕之后&#xff0c;往往会考虑性能方面的优化。在业务发展的初期&#xff0c;性能往往能满足使用的需求&#xff0c;这时性能优化不是必不可少的。随着业务的发展&#xff0c;软件复杂…

Window11开放端口

&#xff08;1&#xff09;打开控制面板&#xff0c;进入【控制面板\系统和安全\Windows Defender 防火墙】 &#xff08;2&#xff09;点击左侧菜单【高级设置】&#xff0c;进入防火墙设置页面 &#xff08;3&#xff09;根据需要选择【入站规则】或者【出站规则】&#xff…

粒子群算法Java实现

粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种受到自然界群体行为启发的优化算法&#xff0c;由James Kennedy和Russell Eberhart于1995年提出。该算法模拟了鸟类或其他动物群体&#xff08;如鱼群&#xff09;的社会和集体行为&#x…

C++:特殊类设计和四种类型转换

一、特殊类设计 1.1 不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98&#xff1a; 1、将拷贝构造函数与赋值运算符重载只…

linux 内核映像差异介绍:vmlinux、zImage、zbImage、image、uImage等

一、背景 Linux内核是整个Linux操作系统的核心部分&#xff0c;它是一个负责与硬件直接交互的软件层&#xff0c;并且提供多种服务和接口&#xff0c;让用户程序能够方便地使用硬件资源。 当我们编译自定义内核时&#xff0c;可以将其生成为以下内核映像之一&#xff1a;vmli…

[每日一练]关于上升的温度查询

该题目来自于力扣&#xff1a; 197. 上升的温度 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 表&#xff1a; Weather ------------------------ | Column Name | Type | ------------------------ | id | int | | recordDate | …

Java网络编程从入门到精通:深入探索与实践指南

Java网络编程从入门到精通&#xff1a;深入探索与实践指南 在数字化时代的浪潮中&#xff0c;Java网络编程已成为连接世界的桥梁。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;带你领略Java网络编程的魅力&#xff0c;助你实现从入门到精通的飞跃。 四个方面…