新闻中心

c++ 友元函数怎么写 c++ friend关键字用法

2025-11-30
浏览次数:
返回列表
友元函数可访问类的私有成员,需用friend关键字在类内声明,如重载输出运算符或实现跨类操作,便于运算符重载与输入输出流处理。

c++ 友元函数怎么写 c++ 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(const MyClass& obj) {
    std::cout << "Secret value: " << obj.secret << std::endl;  // 可以访问 private 成员
}

调用方式:

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance
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表单数据 

搜索