论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
大数据
›
数据仓库与分析
›
cpp-友元
cpp-友元
李优秀
金牌会员
|
2025-3-24 12:03:35
|
显示全部楼层
|
阅读模式
楼主
主题
677
|
帖子
677
|
积分
2031
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
理解 C++ 中的友元(Friend)
在 C++ 语言中,
封装(Encapsulation)
是面向对象编程的重要特性之一。它允许类将数据隐藏在私有(private)或受掩护(protected)成员中,防止外部直接访问。然而,在某些情况下,我们希望某些函数或类能够访问这些私有成员,而不粉碎封装性。这时,我们就需要
友元(Friend)
。
1. 什么是友元?
友元(friend)
是 C++ 提供的一种机制,它允许一个函数或另一个类访问某个类的私有和受掩护成员。友元有三种类型:
友元函数(Friend Function)
友元类(Friend Class)
友元成员函数(Friend Member Function)
2. 友元函数
友元函数是一个非成员函数,但它可以访问类的私有和受掩护成员。要声明友元函数,需要在类内部利用 friend 关键字。
示例:友元函数
#include <iostream>
using namespace std;
class Box {
private:
double width;
public:
Box(double w) : width(w) {}
// 声明友元函数
friend void printWidth(const Box &b);
};
// 定义友元函数
void printWidth(const Box &b) {
cout << "Width: " << b.width << endl;
}
int main() {
Box b(10.5);
printWidth(b);
return 0;
}
复制代码
在上面的示例中,printWidth 不是 Box 类的成员函数,但由于它被声明为 friend,它可以访问 Box 的私有成员 width。
3. 友元类
友元类允许一个类访问另一个类的私有和受掩护成员。
示例:友元类
#include <iostream>
using namespace std;
class Engine {
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
// 声明 Car 为友元类
friend class Car;
};
class Car {
public:
void showEnginePower(const Engine &e) {
cout << "Engine horsepower: " << e.horsepower << endl;
}
};
int main() {
Engine e(150);
Car c;
c.showEnginePower(e);
return 0;
}
复制代码
在这个例子中,Car 是 Engine 的友元类,因此它可以访问 Engine 类的私有成员 horsepower。
4. 友元成员函数
我们还可以只将另一个类的某个成员函数设为友元,而不是整个类。
示例:友元成员函数
#include <iostream>
using namespace std;
class Engine;
class Car {
public:
void showEnginePower(const Engine &e);
};
class Engine {
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
// 声明 Car::showEnginePower 为友元
friend void Car::showEnginePower(const Engine &e);
};
void Car::showEnginePower(const Engine &e) {
cout << "Engine horsepower: " << e.horsepower << endl;
}
int main() {
Engine e(200);
Car c;
c.showEnginePower(e);
return 0;
}
复制代码
这里 Car::showEnginePower 是 Engine 的友元成员函数,因此它可以访问 Engine 的私有成员。
5. 友元的应用场景
友元在以下情况中非常有效:
运算符重载
(如 operator<< 和 operator>> 需要访问类的私有成员)。
类之间的精密协作
(如 Car 需要访问 Engine 的私有数据)。
全局函数需要访问私有数据
(如调试函数、日志记录等)。
6. 友元的优缺点
优点:
允许外部函数/类访问私有数据,增强类之间的协作本领。
使操作符重载更加直观。
缺点:
粉碎了封装性,降低了数据的安全性。
可能导致代码耦合度增长。
7. 总结
友元函数
可以访问类的私有/受掩护成员,但不是类的成员。
友元类
允许另一个类访问本类的私有成员。
友元成员函数
允许一个类的特定成员函数访问本类的私有成员。
友元应该谨慎利用,制止粉碎封装性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
李优秀
金牌会员
这个人很懒什么都没写!
楼主热帖
什么是API密钥及其安全利用指南? ...
【Java结业计划】基于JavaWeb的在线购 ...
基于GLM生成SQL,基于MOSS生成SQL,其 ...
Docker Compose - 安装和基本使用 ...
mac安装java17(jdk17)
【云原生 | 从零开始学Kubernetes】二 ...
[Qt][Qt 网络][下]具体讲解
Linux体系(CentOS)下安装设置 Nginx 超 ...
C#使用NModbus4库创建Modbus TCP Slave ...
CentOS 7.9部署宝塔面板超详细 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
SAP
快速回复
返回顶部
返回列表