C++编程:详解友元功能与三种实现
需积分: 0 159 浏览量
更新于2024-06-20
收藏 508KB PDF 举报
“C++:友元(看这一篇就够了)-c++友元-孙 悟 空的博客-CSDN博客.pdf”
本文详细介绍了C++中的友元(Friend)机制,这是一种打破封装性,允许外部函数或类访问另一个类的私有或保护成员的特性。友元是C++中实现某些特定功能,如数据共享和复杂操作的重要手段。友元的关键字是`friend`。
友元的三种实现方式包括:
1. 全局函数做友元:
在这个场景下,一个全局函数可以通过`friend`声明成为某个类的友元,从而能够访问该类的私有或保护成员。例如,定义一个`Building`类,它有一个公有成员`m_SittingRoom`(客厅)和一个私有成员`m_BedRoom`(卧室)。然后,定义一个全局函数`laoWang1`,通过指针参数访问`Building`类的私有成员`m_BedRoom`。这样做是为了展示全局友元函数如何能绕过封装限制直接访问私有数据。
```cpp
class Building {
public:
Building() : m_SittingRoom("客厅"), m_BedRoom("卧室") {}
// 其他成员...
private:
string m_SittingRoom;
string m_BedRoom;
};
void laoWang1(Building* building) {
std::cout << "隔壁老王全局函数正在访问:(地址传递)" << building->m_SittingRoom << endl;
std::cout << "隔壁老王全局函数正在访问:(地址传递)" << building->m_BedRoom << endl;
}
```
2. 类做友元:
除了全局函数,一个类也可以是另一个类的友元。这意味着类A可以声明类B为它的友元,使得类B的所有成员函数都能够访问类A的私有和保护成员。这种方式常用于两个紧密协作的类之间,比如需要共享数据或实现复杂的操作。
```cpp
class A {
public:
// 声明类B为友元
friend class B;
private:
int privateVar;
};
class B {
public:
void accessPrivateInA(A& a) {
// 友元类B可以访问类A的私有成员
std::cout << "Accessing private in A: " << a.privateVar << endl;
}
};
```
3. 成员函数做友元:
这种情况比较少见,但也是可能的。一个类的成员函数可以被声明为另一个类的友元,允许这个成员函数访问那个类的私有或保护成员。这种做法通常出现在需要在类A的成员函数内部,访问类B的私有成员,而类A与类B又有着紧密的关系。
```cpp
class A {
public:
void someFunction();
private:
int mA;
};
class B {
public:
// 声明类A的成员函数someFunction为友元
friend void A::someFunction();
private:
int mB;
};
void A::someFunction() {
B b;
// 因为someFunction是B的友元,所以可以访问B的私有成员
b.mB = 10;
}
```
友元机制虽然提供了便利,但也带来了一些潜在的问题,比如破坏了封装性,可能导致安全性和可维护性降低。因此,在使用友元时,应当谨慎考虑,尽量避免过度使用。在设计类的时候,优先考虑使用公有和保护接口来实现合作,只有在必要时才使用友元。
2021-12-01 上传
2021-06-23 上传
2011-09-30 上传
2021-10-04 上传
486 浏览量
2009-04-07 上传
孙悟空
- 粉丝: 7496
- 资源: 12
最新资源
- 新型智能电加热器:触摸感应与自动温控技术
- 社区物流信息管理系统的毕业设计实现
- VB门诊管理系统设计与实现(附论文与源代码)
- 剪叉式高空作业平台稳定性研究与创新设计
- DAMA CDGA考试必备:真题模拟及章节重点解析
- TaskExplorer:全新升级的系统监控与任务管理工具
- 新型碎纸机进纸间隙调整技术解析
- 有腿移动机器人动作教学与技术存储介质的研究
- 基于遗传算法优化的RBF神经网络分析工具
- Visual Basic入门教程完整版PDF下载
- 海洋岸滩保洁与垃圾清运服务招标文件公示
- 触摸屏测量仪器与粘度测定方法
- PSO多目标优化问题求解代码详解
- 有机硅组合物及差异剥离纸或膜技术分析
- Win10快速关机技巧:去除关机阻止功能
- 创新打印机设计:速释打印头与压纸辊安装拆卸便捷性