C++面向对象编程:友元函数详解
需积分: 3 38 浏览量
更新于2024-08-18
收藏 263KB PPT 举报
"友元函数-c++ ppt"
在C++编程语言中,友元函数是一种特殊类型的函数,它被授予了访问类的私有(private)和保护(protected)成员的权限,即使这些成员通常对外部代码是不可见的。友元函数不是类的成员,但它们可以像类的成员函数一样操作类的内部数据。这种机制的设计是为了在保持封装性的同时,增加程序的灵活性,使得程序员可以根据需要在封装和效率之间做出权衡。
友元函数的声明通常在类的定义中使用`friend`关键字完成。例如:
```cpp
class MyClass {
public:
// 公共成员
private:
// 私有成员
protected:
// 保护型成员
friend void myFriendFunction(MyClass& obj); // 声明myFriendFunction为友元函数
};
```
在这个例子中,`myFriendFunction`可以访问`MyClass`的所有成员,包括私有和保护成员,即使这些成员对其他非友元函数来说是不可访问的。在函数体中,可以通过类的对象来访问这些成员,如`obj.privateMember`或`obj.protectedMember`。
友元函数的使用有几个关键点:
1. **非成员函数**:友元函数不是类的成员,因此它们不占用类的内存空间,也不具有隐式`this`指针。
2. **访问权限**:友元函数可以直接访问类的私有和保护成员,打破了封装原则,但这增加了程序的灵活性。
3. **控制访问**:虽然友元函数可以访问私有和保护成员,但它们仍然需要遵循程序的逻辑,不能随意修改数据,否则可能破坏类的正确性。
4. **多态性**:由于友元函数不是虚函数,它们不参与多态性,无法体现C++的运行时多态行为。
在实际应用中,友元函数常用于实现一些特定的功能,比如比较两个对象的内部状态(如排序算法),或者在类之间建立特殊的协作关系。例如,一个`Complex`类可能有一个友元函数`print`,用于打印复数的详细信息,而这个信息对于类的使用者来说通常是不可见的。
以下是一个简单的友元函数示例:
```cpp
class Box {
private:
int length;
int width;
int height;
public:
friend void printBoxDetails(Box box);
};
void printBoxDetails(Box box) {
cout << "Length: " << box.length << ", Width: " << box.width << ", Height: " << box.height << endl;
}
int main() {
Box b1;
b1.length = 10;
b1.width = 5;
b1.height = 3;
printBoxDetails(b1);
return 0;
}
```
在这个例子中,`printBoxDetails`函数是`Box`类的友元,它可以访问并打印出`Box`的私有成员。
友元函数在C++中是一个强大的工具,可以用来解决某些特定的编程问题,但应谨慎使用,以避免过度破坏封装性和导致难以维护的代码。在设计类时,应尽量优先考虑使用公共接口和封装,只有在确实需要时才引入友元机制。
2024-05-04 上传
2018-05-09 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
深井冰323
- 粉丝: 24
- 资源: 2万+
最新资源
- yii2_shop:yii2框架上的测试车间
- 漂亮水晶风格的VC++窗体代码
- AISTLAB_nitrotyper-0.6.2-py2.py3-none-any.whl.zip
- 电信设备-木工锯床移动工作台.zip
- reedsolomon.js:JavaScript 中的 Reed Solomon 编码(来自 Zxing)
- learnOS:一个学习的迷你操作系统
- play-with-data-structure:这是我正在学习的有关数据结构的一些代码
- integrations-io-sdk
- 酒馆
- myApp
- [008]m68k手持机的通讯相关源码,适合串口通讯以及ic刷卡编程的使用者参考.zip上位机开发VC串口学习资料源码下载
- AIPipeline-2019.9.12.13.44.48-py3-none-any.whl.zip
- lfg区
- ide
- miyadaiku:面向Jinja2艺术家的灵活的静态网站生成器
- 电信设备-木材移动的推动装置.zip