新闻中心
c++ 友元函数怎么写 c++ friend关键字用法
友元函数可访问类的私有成员,需用friend关键字在类内声明,如重载输出运算符或实现跨类操作,便于运算符重载与输入输出流处理。

在C++中,友元函数(friend function)是一种特殊的函数,它不是类的成员函数,但却可以访问该类的私有(private)和保护(protected)成员。这是通过 friend 关键字实现的。
1. 友元函数的基本写法
在类内部使用 friend 关键字声明一个函数,该函数就可以访问类的所有成员,包括 private 和 protected 成员。
示例:
class MyClass {
private:
int secret;
public:
MyClass(int s) : secret(s) {}
// 声明友元函数
friend void displaySecret(const MyClass& obj);
};
// 定义友元函数(在类外定义,不属于类)
void displaySecret(c
onst MyClass& obj) {
std::cout << "Secret value: " << obj.secret << std::endl; // 可以访问 private 成员
}
调用方式:
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
MyClass obj(42); displaySecret(obj); // 输出: Secret value: 42
2. 友元函数的特点
- 友元函数不是类的成员函数,不写在类的作用域内定义(但需在类中声明)
- 它不受访问控制符限制,可直接访问 private/protected 成员
- 不能用对象调用,如 obj.displaySecret() 是错误的
- 通常用于运算符重载、输入输出流等场景
3. 常见用途:重载输出运算符
最典型的例子是重载 操作符,让 <code>std::cout 能输出自定义类对象:
class Person {
private:
std::string name;
int age;
public:
Person(std::string n, int a) : name(n), age(a) {}
// 声明友元:允许 operator<< 访问私有成员
friend std::ostream& operator<<(std::ostream& os, const Person& p);
};
// 定义友元操作符函数
std::ostream& operator<<(std::ostream& os, const Person& p) {
os << "Name: " << p.name << ", Age: " << p.age;
return os;
}
使用:
Person p("Alice", 25);
std::cout << p << std::endl; // 正常输出
4. 注意事项
- 友元关系是单向的:A是B的友元,不代表B是A的友元
- 友元关系不能被继承
- 滥用友元会破坏封装性,应谨慎使用
- 可以将另一个类或类的成员函数声明为友元
基本上就这些。合理使用 friend 可以提升代码灵活性,尤其在需要外部函数深度访问类内部时非常有用。
以上就是c++++ 友元函数怎么写 c++ friend关键字用法的详细内容,更多请关注其它相关文章!
# 不受
# 文山网站建设哪个平台好
# 南昌物流公司网站建设
# 茂名网站优化销售推广
# 廊坊网站建设服务报价
# 地产seo流程
# 优化网站学什么技能
# 废品收购站网站推广方案
# 简述网站建设行业
# 杭州seo软件专注乐云seo品牌
# 长宁区网站优化价格
# c++
# 相关文章
# 不代表
# 是一种
# 迭代
# 这是
# 解决方法
# 重写
# 有什么
# 运算符
# 作用域
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
PHP URL参数传递与500错误调试指南
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
Lar*el 8 多关键词数据库搜索优化实践
微信网页版官方入口教程 微信网页版网页版快速登录步骤
qq音乐在线播放入口_qq音乐电脑版登录链接
HTML空白字符处理机制:渲染、DOM与编码实践
将HTML动态表格多行数据保存到Google Sheet的教程
AO3访问入口汇总 AO3网页版同人作品一键直达
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
微博网页版首页入口 微博电脑端官网登录链接
痛风发作了怎么办? 快速止痛和后期饮食调理
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
J*a应用程序首次运行自动创建文件与目录的最佳实践
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
实现全屏滚动与导航点:专业教程
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
12306几点到几点不能订票? | 官方最新系统维护时间全解析
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
TikTok国际版官网直达_TikTok国际版官网直达进入在线观看
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
58动漫网在线官方网 58动漫网正版动漫入口网址
J*aScript中localStorage数据的获取、清洗与格式化教程
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
excel怎么制作工资条 excel快速生成工资条的方法
c++如何使用chrono库处理时间_c++标准库时间与日期操作
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
优化Log4j2控制台输出性能:解决异步日志瓶颈
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
在命令行怎么运行html项目_命令行运行html项目方法【教程】
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
美团外卖商家服务中心入口 美团商家版官网入口
iCloud登录入口网页版 苹果iCloud官网登录
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
如何使用纯J*aScript判断Input元素是否在特定类容器内
Python Socket多播通信中指定源IP地址的实践指南
2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
Golang如何使用const iota_Go iota常量计数器讲解
理解Python模块与全局变量的作用域管理
b站如何看历史记录_b站观看历史找回方法
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
b站怎么删除评论_b站评论管理与删除操作
Go语言中高效处理x-www-form-urlencoded表单数据


2025-11-30
浏览次数:次
返回列表
onst MyClass& obj) {
std::cout << "Secret value: " << obj.secret << std::endl; // 可以访问 private 成员
}