C++类设计:掌握友元类与友元函数的应用
需积分: 5 22 浏览量
更新于2024-11-29
收藏 1KB ZIP 举报
资源摘要信息:"C++中的友元类和友元函数是面向对象编程中的重要概念。友元类可以访问另一个类的私有和保护成员,而友元函数可以访问私有和保护成员,但它们不属于类的成员函数。"
首先,我们需要理解C++中的类访问权限。在C++中,类的成员可以是公有的(public)、受保护的(protected)或者私有的(private)。公有成员可以在程序的任何地方被访问,受保护的成员只能被类自身、派生类和友元访问,而私有成员则只能被类自身访问。
接下来,我们来深入探讨友元类和友元函数的概念及其用法。
1. 友元函数:
友元函数是一个非成员函数,它可以访问类的私有和保护成员。通过将函数声明为类的友元,我们可以使该函数能访问类的所有成员,无论它们的访问权限如何。友元函数的声明通常出现在类的定义中,使用关键字`friend`。
友元函数的使用场景包括:
- 当你需要一个函数来访问类的私有成员时,但又不希望这个函数成为类的成员函数。
- 用于重载运算符,特别是当需要访问类的私有成员时。
例如,一个简单的友元函数使用示例代码如下:
```cpp
#include <iostream>
using namespace std;
class Box {
double width;
public:
double length;
friend void printWidth(Box box);
void setWidth(double wid);
};
// 请注意:此函数不是Box的成员函数,它不能直接访问Box的成员
void printWidth(Box box) {
// 因为是友元函数,所以可以访问私有成员width
cout << "Width of box : " << box.width << endl;
}
void Box::setWidth(double wid) {
width = wid;
}
int main() {
Box box;
box.setWidth(10.0);
printWidth(box); // 调用友元函数
return 0;
}
```
在上面的代码中,`printWidth` 函数被声明为 `Box` 类的一个友元函数,因此它可以访问 `Box` 类的私有成员 `width`。
2. 友元类:
友元类是另一个类,它被授予特殊权限,可以访问类的所有成员,包括私有和保护成员。一个类可以指定另一个类为友元类,这意味着所有在友元类中的成员函数都可以访问被声明为友元类的类的私有成员。
友元类的使用场景通常包括:
- 在两个类之间共享私有数据。
- 当一个类需要访问另一个类的私有成员时,可能是因为两个类需要互相访问对方的私有数据。
例如,一个简单的友元类使用示例代码如下:
```cpp
#include <iostream>
using namespace std;
class Box; // 前向声明
class BoxAccess {
public:
void setWidth(Box &box, double wid);
};
class Box {
double width;
friend class BoxAccess; // BoxAccess类是Box类的友元类
public:
double length;
void setWidth(double wid);
};
void Box::setWidth(double wid) {
width = wid;
}
void BoxAccess::setWidth(Box &box, double wid) {
box.width = wid; // 因为BoxAccess是Box的友元类,所以可以访问私有成员width
}
int main() {
BoxAccess access;
Box box;
access.setWidth(box, 10.0); // 使用友元类函数设置宽度
cout << "Width of box : " << box.width << endl; // 输出宽度
return 0;
}
```
在这个例子中,`BoxAccess` 类被声明为 `Box` 类的友元类,因此它可以直接访问 `Box` 类的私有成员 `width`。
总结:
友元类和友元函数在C++中用于访问类的私有和保护成员,但不改变类的封装性。它们为某些特定的函数和类提供了访问权限,而不需要将这些函数或类声明为类的成员。这样可以增强类之间的交互性,但同时也需要谨慎使用,避免过度依赖友元关系破坏类的封装性。在实际开发中,只有当确实需要从类外部访问私有或保护成员时,才使用友元关系。
2021-07-14 上传
2022-09-21 上传
2021-07-14 上传
2021-07-14 上传
2021-07-14 上传
155 浏览量
276 浏览量
2021-02-17 上传
2021-07-14 上传
weixin_38623919
- 粉丝: 6
- 资源: 929
最新资源
- rsync配置与使用(v2.0)
- SUSE Linux Enterprise Server操作系统安装手册
- matlab课件matlab绘图Matlab计算与仿真技术
- NET and C#外文翻译(下载前请看“软件说明”)
- 数字电子技术基础 阎石第四版课后习题答案
- java实现工作流以及工作流的处理
- 用 Apache 和 Subversion 搭建安全的版本控制环境
- matlab应用大全
- WCF安全指南 WCF Security Guide
- unix下的vi入门命令集锦
- C++_tutorial.pdf
- 计算机三级C语言91-100
- 电子行业的英语词汇大全
- informix 常用命令
- 《信号与系统》实验讲义 matlab
- EM78811数据手册