一文搞懂友元函数和友元类

简介: 1.友元概念友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

1.友元概念

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

2.友元函数

试想一种场景,需要重载operator<<,然而发现没办法将operator<<重载成成员函数,因为类成员函数的第一个参数默认为this,而第一个位置正是左操作数的位置,正常来说我们输出逻辑为这样(cout<< xxx);若this抢占第一个参数,我们只能这样输出(xxx<<cout);这显然不符合逻辑,所以我们只能将它重载为全局函数。但这又无法访问私有成员变量,因此友元函数被引出来了。

语法如下:

class A
{
  friend int Add(int a, int b);  //告诉函数A,Add函数是它的好朋友,这样Add能访问A的任何成员。
private:
  int _year;
  int _month;
};
int Add(int a, int b)
{
  return a + b;
}

2.1 友元函数特性

  1. 友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
  2. 友元函数不能用const修饰

 3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制。

 4.一个函数可以是多个类的友元函数。

  5.友元函数调用与普通函数调用原理相同。

3.友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类种的非公有成员。

  • 友元关系时单向的,不具有交换性。(Time是Date的友元,但反过来不成立)。
class Date
{
  friend class Time;   //告诉Date,Time是Date的友元类,Time可以访问Date的所有
private:
  int _year;
  int _month;
  int _day;
};
class Time
{
private:
  int _hour;
  int _min;
  int _sec;
};
  • 友元关系不能传递。
    如果C是B的友元,B是A的友元,不能说明C是A的友元。
  • 友元关系不能继承。

目录
相关文章
|
机器学习/深度学习 算法 Python
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
1770 0
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
|
存储 Kubernetes 网络协议
【K8S系列】深入解析StatefulSet(一)
【K8S系列】深入解析StatefulSet(一)
1172 2
|
缓存 图形学
游戏通用解决方案之红点设计
游戏通用解决方案之红点设计
1207 0
|
缓存 运维 监控
物联网平台提供的功能特性(一)
物联网平台提供的功能特性(一)
800 0
|
存储 算法
halcon模板匹配实践(1)算子参数说明与算子简介
halcon模板匹配实践(1)算子参数说明与算子简介
1289 0
|
SQL 存储 前端开发
< 今日份知识点:web常见的攻击方式(网络攻击)有哪些?如何预防?如何防御呢 ? >
网络安全威胁日益严重,2017年的永恒之蓝勒索病毒事件揭示了网络攻击的破坏力。为了防御Web攻击,了解攻击类型至关重要。Web攻击包括XSS、CSRF和SQL注入等,其中XSS分为存储型、反射型和DOM型,允许攻击者通过注入恶意代码窃取用户信息。防止XSS攻击的方法包括输入验证、内容转义和避免浏览器执行恶意代码。CSRF攻击则伪装成用户执行操作,防范措施包括同源策略和CSRF Token验证。SQL注入则通过恶意SQL语句获取数据,预防手段包括输入验证和使用预编译语句。面对网络威胁,加强安全意识和实施防御策略是必要的。
703 0
|
测试技术 C# 开发工具
C# 标准性能测试
本文介绍如何使用 BenchmarkDotNet 工具进行性能测试。通过 GitHub 代码示例展示如何安装并应用此工具,对函数或静态方法进行精确的性能分析。首先需通过 NuGet 安装 BenchmarkDotNet,然后在测试函数上添加 `[Benchmark]` 特性,并使用 `BenchmarkRunner.Run&lt;&gt;();` 进行测试。测试过程中包括 Pilot、Warmup 和 Target 等阶段,并提供 Mean、Error 和 StdDev 等统计信息。
316 3
C# 标准性能测试
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
1149 4
|
存储 Java 开发工具
轻松搭建分布式对象存储:Spring Boot整合MinIO的快速指南
轻松搭建分布式对象存储:Spring Boot整合MinIO的快速指南
1410 0
轻松搭建分布式对象存储:Spring Boot整合MinIO的快速指南
|
前端开发
async/await返回的promise被解析为undefined的可能原因
`async/await` 通常与 `Promise` 一起使用,但如果返回的 `Promise` 被解析为 `undefined`,可能有几个原因。以下是一些可能的情况和解决方法

热门文章

最新文章