C++友元函数与友元类深入解析
版权申诉
102 浏览量
更新于2024-10-03
收藏 6KB RAR 举报
资源摘要信息:"C++友元函数和友元类的详细介绍"
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`。
总结来说,友元函数和友元类都是破坏封装性的一种手段,它们允许非成员函数或者非成员类访问类的私有成员。在设计程序时,应当谨慎使用友元,因为过度使用会破坏类的封装性和模块化,从而使得程序更难维护和理解。只有在确实需要外部访问私有成员时,才应该考虑使用友元。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2022-09-24 上传
2022-09-23 上传
2021-08-12 上传
2021-08-11 上传
2022-09-14 上传
御道御小黑
- 粉丝: 78
- 资源: 1万+
最新资源
- ROCKKE
- ghidra-r2web:Ghidra插件启动r2网络服务器以使r2与之交互
- 3943621,c语言挂号系统文件源码,c语言
- chromedriver-mac-arm64-V124.0.6367.91 稳定版
- 黑色模块化企业网站模板
- 1000km Fund Status-crx插件
- webpages
- bssg:用bash编写的静态站点生成器。 您可以在以下网址中查看结果
- MenuChef::hamburger:像厨师一样制作汉堡菜单
- Python库 | compost-0.2.4.zip
- bqezdls,c语言mp3播放器源码,c语言
- chromedriver-mac-V124.0.6367.91 稳定版
- [removed]我学习JavaScript时的一些项目
- Pigeon_Infinity_django
- Banking-System:基本银行系统,具有一些基本功能,包括创建用户,汇款和交易历史记录。 它也包括数据库
- gmailbackup:备份您的Gmail InboxArchive