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

C++中,`friend`关键字的使用

在C++中,friend关键字用于指定某些函数或类可以访问另一个类的私有或保护成员。以下是关于friend关键字的详细说明:

1. friend的基本用法

(1) 声明友元函数
class MyClass {
private:int secret;public:MyClass(int s) : secret(s) {}// 声明友元函数friend void displaySecret(const MyClass& obj);
};// 定义友元函数
void displaySecret(const MyClass& obj) {std::cout << "Secret: " << obj.secret << std::endl;
}

在这个例子中,displaySecret函数被声明为MyClass的友元函数,因此它可以访问MyClass的私有成员secret

(2) 声明友元类
class FriendClass;class MyClass {
private:int secret;public:MyClass(int s) : secret(s) {}// 声明友元类friend class FriendClass;
};class FriendClass {
public:static void accessSecret(const MyClass& obj) {std::cout << "Secret: " << obj.secret << std::endl;}
};

在这个例子中,FriendClass被声明为MyClass的友元类,因此FriendClass中的所有成员函数都可以访问MyClass的私有成员。

2. friend的关键特性

  • 访问控制friend关键字允许指定的函数或类访问类的私有和保护成员。
  • 不改变访问权限:被声明为友元的函数或类不能通过友元关系直接访问其他类的私有或保护成员。
  • 单向访问:如果A是B的友元,B不一定需要是A的友元。
  • 不继承:友元关系不会被继承。子类不能自动获得父类友元的访问权限。

3. 示例代码

#include <iostream>
using namespace std;class B;class A {
private:int x;public:A(int a) : x(a) {}// 声明B为友元类friend class B;
};class B {
public:void display(const A& a) {cout << "Value of x in A: " << a.x << endl; // 可以访问A的私有成员x}
};int main() {A obj(10);B b;b.display(obj); // 输出: Value of x in A: 10return 0;
}

4. 注意事项

  • 滥用friend可能导致代码难以维护:过度使用friend可能会破坏封装性,因此应该谨慎使用。
  • 友元关系是单向的:一个类可以声明另一个类或函数为友元,但这并不意味着友元关系是双向的。
  • 友元关系不会传播:即使AB的友元,B也不能通过A访问C的私有成员。

希望这些信息对你有所帮助!如果你有更多问题或需要进一步的例子,请随时告诉我。

http://www.xdnf.cn/news/9454.html

相关文章:

  • 【数据分析】Matplotlib+Pandas+Seaborn绘图
  • 玻纤效应的时序偏差
  • 大模型本地部署
  • 内网穿透,代理服务,NAT
  • HTTP Accept简介
  • 鸿蒙---使用真机模拟器的时候,图片不加载问题
  • NV295NV306美光固态闪存NV313NW830
  • 决胜2025:企业级BI产品深度评测与选型指南
  • vue+elementUi+axios实现分页(MyBatis、Servlet)
  • Linux进程调度的理解
  • Web攻防-SQL注入增删改查HTTP头UAXFFRefererCookie无回显报错
  • Redis集群热点Key问题解决方案
  • 通过mailto:实现web/html邮件模板唤起新建邮件并填写内容
  • LabVIEW双光子荧光成像软件开发
  • 关于余数的定理
  • 【计算机网络】第1章:概述—分组延时、丢失和吞吐量
  • 大模型-高通性能测试工具介绍-1
  • 基于ESP-IDF的ESP32开发记录——如何建立一个队列
  • 使用Spring AI集成Perplexity AI实现智能对话(详细配置指南)
  • 【PhysUnits】13 改进减法(sub.rs)
  • Vue开发系列——Vue 生命周期钩子 及常见知识点
  • STP(生成树协议)原理与配置
  • XCTF-web-easyphp
  • BugKu Web渗透之source
  • 虚幻GamePlay框架
  • 《函数栈帧的创建和销毁》
  • AI--知识库RAG实战
  • @Transactional高级用法之传播机制
  • 基于对比学习的推荐系统开发方案,使用Python在PyCharm中实现
  • CSS3实现的账号密码输入框提示效果