
C++友元函数与友元类深入解析
版权申诉
6KB |
更新于2024-10-03
| 14 浏览量 | 5 评论 | 举报
收藏
C++是一种强大的编程语言,它的许多特性使它在软件开发领域得到了广泛的应用。其中,友元函数和友元类是C++中的一个重要概念,它们在类的封装性上提供了一种特殊的方式。在这篇文章中,我们将详细介绍C++的友元函数和友元类。
首先,我们需要明白什么是封装。在面向对象编程中,封装是一种将数据(或状态)和行为捆绑在一起的方法,并且这种捆绑是隐藏的,这意味着外部代码无法直接访问内部数据,只能通过公共接口与对象交互。封装可以保护对象的状态,并且使得代码更加模块化。
然而,在某些情况下,我们可能需要打破封装性,允许某些函数或者类访问类的私有或保护成员。这就是友元函数和友元类的用武之地。友元不是类的成员函数,但它们有权访问类的私有和保护成员。
1. 友元函数
友元函数是一个普通函数,它被允许访问类的私有和保护成员。要使一个函数成为类的友元,我们需在类定义中使用关键字`friend`。友元函数可以是另一个类的成员函数,也可以是全局函数。
友元函数的声明应该放在类定义中的任何访问控制符(public, private, protected)之外。友元函数没有访问限制,它们可以访问类的所有成员,包括私有和保护成员。
下面是友元函数的一个例子:
```cpp
class Box {
double width;
public:
double length;
friend void printWidth(Box box); // 友元函数
void setWidth(double wid);
};
// 函数定义
void Box::setWidth(double wid) {
width = wid;
}
// 友元函数定义
void printWidth(Box box) {
// 友元函数可以访问私有成员
std::cout << "Width of box : " << box.width << std::endl;
}
```
在这个例子中,`printWidth`是一个友元函数,它可以直接访问`Box`类的私有成员`width`。
2. 友元类
友元类可以访问另一个类的所有成员,包括私有成员。当一个类声明另一个类为友元时,这个声明必须在另一个类的声明中进行。友元关系不是相互的,除非明确声明。
例如:
```cpp
class Square; // 前向声明
class Rectangle {
int width;
friend class Square; // 声明Square为友元类
public:
int height;
void总面积(int w, int h) {
width = w;
height = h;
}
};
class Square {
private:
int side;
public:
void area() {
Rectangle rectangle;
rectangle总面积(side, side);
std::cout << "Area of rectangle : " << rectangle.width * rectangle.height << std::endl;
}
};
```
在这个例子中,`Square`类被声明为`Rectangle`类的友元,因此`Square`可以访问`Rectangle`的私有成员`width`和`height`。
总结来说,友元函数和友元类都是破坏封装性的一种手段,它们允许非成员函数或者非成员类访问类的私有成员。在设计程序时,应当谨慎使用友元,因为过度使用会破坏类的封装性和模块化,从而使得程序更难维护和理解。只有在确实需要外部访问私有成员时,才应该考虑使用友元。
相关推荐








资源评论

贼仙呐
2025.05.31
对C++友元函数和友元类有了深入了解,适合初学者学习。

王佛伟
2025.05.18
适合查找Visual C++中友元用法的开发者。

开眼旅行精选
2025.03.19
标签精确,确为Visual C++领域内的重要资源。🌋

蔓誅裟華
2025.02.02
教程内容详实,友元概念讲解清晰,易于理解。

牛站长
2025.01.13
文章结构合理,示例代码丰富,学习价值高。

御道御小黑
- 粉丝: 95
最新资源
- 利用RichEdit创建彩色TEXT控件技巧
- SyGate 4.5chs:轻松实现局域网共享上网
- ASP.net实现可自绘加减法验证码解决方案
- 22KB小巧加密解密神器:保护您的隐私文件安全
- 面向对象实现单链表的归并排序方法探究
- 通过串口实现JPEG图像的二进制数据接收与存储
- Java邮件开发必知:mail.jar与activation.jar
- 基于Struts、Hibernate、Velocity和MySQL实现用户登录注册功能
- VC++与OpenGL联手打造三维游戏开天辟地
- C#开发模拟电梯提示面板教程
- 探索ASP.NET AJAX组件安装文件
- Cisco 4006交换机配置手册详细指南
- 探索VS2005中DataGridView+的多样化样式列控件
- 掌握企业级应用开发:VS.NET、UML与MSF源代码解析
- C++与SQL打造的企业备忘录管理系统
- 掌握数据库备份与还原的核心技术
- ACCP5.0 C#经典案例解析与教程
- asp入门基础教程——从新手到专家
- 深入分析JSP网站页面代码及其应用场景
- C++数据结构程序菜单:运动会、纸牌、迷宫
- eclipse最新版struts插件的安装与使用
- SSD5第六练习的答案解析
- 深入探讨OpenGL图形组合技术与VC++实现
- VB旅馆管理系统:结帐与空房信息管理