C++中的友元函数详解:访问私有成员的秘密通道
需积分: 37 161 浏览量
更新于2024-09-13
收藏 73KB PDF 举报
"友元函数是C++编程中一种特殊的关系,它允许非成员函数或者类访问另一个类的私有和保护成员。这种机制打破了封装的常规规则,但有时是必要的,例如为了实现特定的算法或者提高代码效率。在本文中,我们将详细探讨友元函数的两种形式:全局友元函数和友元成员函数。
首先,我们来看全局友元函数。全局友元函数是在类外部定义的函数,通过`friend`关键字在类的声明中被指定为友元。这使得友元函数可以直接访问类的私有和保护成员,而无需通过公有接口。下面是一个示例:
```cpp
class Time {
public:
Time(int = 1, int = 1, int = 1);
friend void call(Time&); // 声明全局友元函数
private:
int hour;
int min;
int sec;
};
Time::Time(int h, int m, int s) {
hour = h;
min = m;
sec = s;
}
void call(Time& t) { // 全局函数,同时也是Time类的友元函数
std::cout << "Call: " << t.hour << "-" << t.min << "-" << t.sec << std::endl; // 访问private成员
}
int main() {
Time t;
call(t);
system("PAUSE");
return EXIT_SUCCESS;
}
```
在这个例子中,`call`函数被声明为`Time`类的友元,因此它可以访问`Time`类的私有成员`hour`, `min`, 和 `sec`。
其次,我们讨论友元成员函数。友元成员函数是属于某个类的成员函数,但它也被另一个类声明为友元。这意味着它可以在其所属类的权限范围内访问其他类的私有和保护成员。以下是一个例子:
```cpp
class Date; // 对Date类的提前引用声明
class Time {
public:
Time(int = 1, int = 1, int = 1);
void call(Date&); // 声明成员函数
private:
int hour;
int min;
int sec;
};
class Date {
public:
Date(int = 1, int = 1, int = 2008);
friend void Time::call(Date&); // 声明Time类的call为本类的友元成员函数
private:
int year;
int mon;
int d;
};
```
在这个例子中,`Time`类的成员函数`call`被`Date`类声明为友元,因此`call`可以在访问`Date`类的私有成员时,不必通过`Date`的公共接口。
使用友元函数和类需谨慎,因为它们破坏了数据封装,可能导致代码难以理解和维护。然而,在某些情况下,如实现特定的数据结构(如关联数组或图形结构)或者优化性能时,友元函数可能是必要的。理解并适当地应用友元机制是C++程序员必须掌握的重要概念之一。"
2010-01-15 上传
2021-01-20 上传
2021-01-21 上传
点击了解资源详情
2010-05-31 上传
2023-03-09 上传
点击了解资源详情
点击了解资源详情
wangbin_147
- 粉丝: 0
- 资源: 4
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章