C++友元函数编程:新手指南与两种实现方式
版权申诉
97 浏览量
更新于2024-10-06
收藏 461KB ZIP 举报
资源摘要信息:"本资源提供了两种C++友元函数编程方式的简单演示,非常适合新手学习参考。友元函数是C++中一个重要的特性,它允许一个函数访问另一个类的私有成员。虽然友元函数提供了灵活性,但使用时需要谨慎,以避免破坏封装性。本例程中的两种友元方式,一是让全局函数成为友元,二是让另一个类的成员函数成为友元。"
知识点详细说明:
1. C++友元函数概念:
友元函数是C++中的一个特性,它允许一个函数访问另外一个类的私有成员或保护成员。友元函数不是类的成员函数,但需要在类内部声明为友元,这使得友元函数能够访问类的私有数据,从而实现某些特定的功能。
2. 友元函数的两种主要方式:
- 全局函数作为友元:将全局函数声明为某个类的友元,使其能访问该类的私有或保护成员。
- 另一个类的成员函数作为友元:将另一个类的成员函数声明为友元,允许它访问友元类的私有或保护成员。
3. 友元函数的声明语法:
在类的定义中,使用关键字`friend`来声明友元函数。具体语法为:
```cpp
class 类名 {
friend 返回类型 友元函数名(参数列表);
// 类的其他成员...
};
```
或者对于另一个类的成员函数作为友元,语法为:
```cpp
class 类A {
friend class 类B;
// 类A的其他成员...
};
```
4. 全局函数成为友元的示例:
假设有一个类`Rectangle`,我们希望一个全局函数`area`能够计算它的面积,那么可以如下声明:
```cpp
class Rectangle {
int width, height;
public:
Rectangle(int w = 0, int h = 0) : width(w), height(h) {}
friend int area(const Rectangle& r);
};
int area(const Rectangle& r) {
return r.width * r.height;
}
```
在这个例子中,`area`函数虽然是全局函数,但它被声明为`Rectangle`类的友元函数,因此可以访问`Rectangle`类的私有成员。
5. 另一个类的成员函数成为友元的示例:
如果有两个类`A`和`B`,并且希望`A`中的成员函数能够访问`B`的私有成员,可以这样声明:
```cpp
class B; // 先前声明类B,因为后续要在A中声明B的成员函数为友元
class A {
public:
void setB(B& b);
};
class B {
friend void A::setB(B& b);
private:
int data;
};
void A::setB(B& b) {
b.data = 10; // 成员函数setB可以访问B的私有成员data
}
```
在这个例子中,`B`类声明了`A`类的成员函数`setB`作为友元,因此`setB`可以访问`B`的私有成员`data`。
6. 友元函数的使用注意事项:
- 破坏封装性:友元函数虽然灵活,但使用不当会破坏类的封装性,因此应当谨慎使用。
- 类之间的耦合:友元关系增加了类之间的耦合度,使得类设计更加复杂。
- 维护困难:随着程序的增长,友元函数可能会导致程序的维护变得更加困难。
7. 友元函数与成员函数的区别:
- 友元函数不是类的成员,没有this指针,其访问类的私有成员时需要明确指出对象名。
- 成员函数可以直接使用this指针访问类的成员,不需要显式写出对象名。
- 友元函数不能被继承,也不需要通过对象调用,而成员函数具有继承性和对象依赖性。
8. 友元函数的适用场景:
- 当一个类需要将它的实现细节提供给另一个函数或类访问时。
- 当操作符重载涉及到类的私有数据时,往往将重载的函数声明为友元。
- 当一个类的接口不满足函数的操作需求时,需要友元函数来实现某些特定功能。
总结,通过以上两种友元函数的编写方式,新手可以快速掌握友元函数的用法。然而,由于友元函数的使用涉及到类的封装性和耦合性问题,建议在真正需要时才使用友元函数,并且在设计类时要尽量保持其独立性和封装性,避免不必要的友元关系。
2021-10-03 上传
2021-10-02 上传
2021-07-14 上传
点击了解资源详情
点击了解资源详情
2021-09-28 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
耿云鹏
- 粉丝: 69
- 资源: 4759
最新资源
- 深入浅出:自定义 Grunt 任务的实践指南
- 网络物理突变工具的多点路径规划实现与分析
- multifeed: 实现多作者间的超核心共享与同步技术
- C++商品交易系统实习项目详细要求
- macOS系统Python模块whl包安装教程
- 掌握fullstackJS:构建React框架与快速开发应用
- React-Purify: 实现React组件纯净方法的工具介绍
- deck.js:构建现代HTML演示的JavaScript库
- nunn:现代C++17实现的机器学习库开源项目
- Python安装包 Acquisition-4.12-cp35-cp35m-win_amd64.whl.zip 使用说明
- Amaranthus-tuberculatus基因组分析脚本集
- Ubuntu 12.04下Realtek RTL8821AE驱动的向后移植指南
- 掌握Jest环境下的最新jsdom功能
- CAGI Toolkit:开源Asterisk PBX的AGI应用开发
- MyDropDemo: 体验QGraphicsView的拖放功能
- 远程FPGA平台上的Quartus II17.1 LCD色块闪烁现象解析