当前位置: 首页 > news >正文

C++ 友元

文章目录

  • 前言
  • 一、什么是友元
  • 二、友元的特性
  • 三、示例代码
  • 总结

前言

在C++编程中,友元(friend)是一种特殊的关系,允许一个类或函数访问另一个类中的私有成员。


一、什么是友元

1.友元 的定义:

友元在C++中可以被用于类和函数。对于类来说,可以创建一个友元类或友元函数。友元类可以 直接访问其它类的私有成员 ,而友元函数可以访问某一个类的私有成员。

2.友元 的声明:

在类定义中,可以使用 friend 关键字声明一个类或函数为友元。声明通常放在类的访问说明符(public、private、protected)之间。

友元 关系发生在函数与类之间 或者 类与类 之间。

class MyClass {
private:int privateData;
public:friend class FriendClass; // 友元类声明friend void FriendFunction(); // 友元函数声明
};

二、友元的特性

1.局限性

友元的使用应该谨慎,并且遵循信息隐藏的原则。友元的目的是提供更灵活的访问权限,但也可能破坏封装性和安全性。应该尽量避免滥用友元,只在必要的情况下使用。

2.友元 关系的传递性

友元 关系不能传递,友元 关系 是单向的。 即使一个类 A 是类 B 的友元,类 B 的友元类不会自动成为类 A 的友元。
如果 A 是 B 的友元, B 是 C 的友元,则 C 不是 A 的友元,不可以传递使用。
在这里插入图片描述

三、示例代码

  1. 示例一:
    友元函数允许函数访问类中的私有成员。被声明为友元的函数可以直接访问友元类的私有成员。
class Point
{int a, b;						// a,b 是类的私有成员
public:Point(int a, int b){this->a = a;this->b = b;}friend void fun(Point&p);			//声明 友元 函数
};void fun(Point& p)
{printf("a = %d, b = %d\n",p.a,p.b);			//在 fun 函数内可直接访问 类的私有成员
}int main(void)
{Point p(1,2);fun(p);return 0;
}

在这里插入图片描述

  1. 示例 二
    友元类允许一个类访问另一个类中的私有成员。被声明为友元的类可以直接访问友元类的私有成员。
class name1
{const char* n;
public:name1(const char* n){this->n = n;}friend class name2;				// 声明 友元 类
};class name2
{
public:void GetName1(name1& name)				// 打印 name1 类的名字{printf("name1 ==> %s\n", name.n);		// 访问 私有成员}
};int main(void)
{name1 n1("hello");name2 n2;n2.GetName1(n1);return 0;
}

在这里插入图片描述


总结

友元是一个强大的特性,但应谨慎使用。正确理解和使用友元关系,可以在需要的时候提供更灵活的访问权限,同时保持良好的封装性和安全性。在设计类和函数时,考虑友元是否需要,并仔细评估其对程序结构的影响。

http://www.lryc.cn/news/116080.html

相关文章:

  • Vulkan 绘制显示设计
  • Linux性能分析工具介绍(一)--cpu及功耗相关工具介绍
  • 智能财务分析的无冕之王-奥威BI数据可视化工具
  • .NET 应用程序 部署
  • Linux CentOS安装NVIDIA GPU驱动程序和NVIDIA CUDA工具包
  • 剑指Offer13.机器人的运动范围 C++
  • List、Map、Set打印
  • 软件机器人在渔业船员证书核发中自动化二次审批制证,提高效率和准确性
  • Godot4 C# vscode开发环境搭建
  • nginx简介与安装配置,目录结构和配置文件介绍
  • CTF流量题解http4.pcapng
  • 旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?
  • STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED
  • 数组相关练习
  • Leetcode-每日一题【剑指 Offer 11. 旋转数组的最小数字】
  • git教程(第一次使用)
  • Autoware.ai1.14.0自动驾驶-Demo运行
  • AttributeConverter
  • 【逗老师的PMP学习笔记】8、项目质量管理
  • Zookeeper集群
  • 后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)
  • 【香瓜说职场】第10月(2018.01.29)
  • ​LeetCode解法汇总1749. 任意子数组和的绝对值的最大值
  • 4.2、Flink任务怎样读取文件中的数据
  • Effective Java笔记(28)列表优于数组
  • 做BI领域的ChatGPT,思迈特升级一站式ABI平台
  • ELFK——ELK结合filebeat日志分析系统(2)
  • webSocket 协议是什么
  • CentOS 7迁移Anolis OS 8
  • Transformer 立体视觉 Depth Estimation