C++ friend友元函数_C++访问私有成员变量


友元函数是用friend关键字声明的非成员函数,可访问类的私有和保护成员。1. 它不属于类,不能通过对象调用;2. 必须在类内声明,可定义在类外;3. 常用于运算符重载等场景。

c++ friend友元函数_c++访问私有成员变量

在C++中,类的私有成员变量(private members)默认只能由该类的成员函数访问,外部函数或其它类无法直接访问。但有时候我们需要让某个非成员函数或另一个类能够访问这些私有数据,这时就可以使用 友元函数(friend function)

什么是友元函数?

友元函数是一种特殊的函数,它虽然不是类的成员函数,但被授予访问该类所有私有和保护成员的权限。通过在类定义中使用 friend 关键字声明一个函数为友元,这个函数就能像成员函数一样访问类的私有变量。

示例:通过友元函数访问私有成员变量

下面是一个简单的例子,展示如何使用友元函数访问类的私有成员:

#include <iostream>
using namespace std;

class MyClass {
private:
    int secretValue;

public:
    MyClass(int val) : secretValue(val) {}

    // 声明一个友元函数
    friend void displaySecret(const MyClass& obj);
};

// 友元函数定义 —— 不是成员函数,但可以访问 private 成员
void displaySecret(const MyClass& obj) {
    cout << "Accessing private member: " << obj.secretValue << endl;
}

int main() {
    MyClass obj(42);
    displaySecret(obj);  // 输出: Accessing private member: 42
    return 0;
}

在这个例子中,displaySecret 不是 MyClass 的成员函数,但由于被声明为 friend,它可以访问 secretValue 这个私有变量。

Picit AI Picit AI

免费AI图片编辑器、滤镜与设计工具

Picit AI 172 查看详情 Picit AI

友元函数的特点

  • 友元函数不属于类,因此不能通过对象调用,也不具有 this 指针。
  • 它必须在类内部用 friend 关键字声明,但可以在类外定义。
  • 它可以是普通函数、其他类的成员函数,甚至是整个类(即友元类)。
  • 友元关系不具备继承性,也不能传递。

什么时候使用友元函数?

常见于以下场景:

  • 运算符重载:比如重载 stream 输出流函数设为友元。
  • 工具函数需要访问内部数据:如调试、序列化等函数需要读取对象私有状态。
  • 两个类之间紧密协作:可使用友元类来增强访问能力。

示例:重载

class Person {
private:
    string name;
    int age;
public:
    Person(string n, int a) : name(n), age(a) {}

    // 声明 operator<< 为友元
    friend ostream& operator<<(ostream& os, const Person& p);
};

// 定义友元操作符函数
ostream& operator<<(ostream& os, const Person& p) {
    os << "Name: " << p.name << ", Age: " << p.age;
    return os;
}

// 使用时可以直接输出
// cout << personObj;

注意事项

尽管友元提供了便利,但也破坏了封装性,应谨慎使用:

  • 不要滥用友元,否则会削弱面向对象设计的优势。
  • 只在确实需要外部函数访问私有成员时才使用。
  • 尽量将友元函数设计为内联或轻量级,避免复杂逻辑。

基本上就这些。友元函数是C++中一种灵活但需小心使用的机制,合理使用可以让接口更自然,同时保持必要的数据访问控制。

以上就是C++ friend友元函数_C++访问私有成员变量的详细内容,更多请关注其它相关文章!


# ai  # 塔城市seo推广  # 网络内部seo的方式  # 几种方法  # 检测方法  # 是一个  # 滤镜  # 用友  # 它可以  # 几种  # 如何判断  # 运算符  # 是否存在  # stream  # ios  # c++  # access  # 德兴低价网站建设招标  # 网站社交平台推广  # 滨州网站建设优化排名  # 湖北网站优化机构  # 网站制作建设工程管理  # 什么叫seo整站优化  # 湄潭seo网站优化  # 安阳seo网站推广费用 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践  个人所得税办理入口 个人所得税综合所得年度汇算入口  为什么XML解析器对大小写敏感? 理解XML规范中的大小写规则与最佳实践  抖音网页版地址直接进入_抖音网页版在线观看入口  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  Retrofit根路径POST请求:@POST("/") 的应用与解析  更换小红书群背景怎么换?小红书群规则怎么设置?  《随手记》关闭首页消息推送方法  123平台官方登录入口 123邮箱网页端在线沟通工具  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  J*aScript实现下拉菜单驱动的动态表格数据展示  店铺如何关联视频号推广?视频号推广有什么用?  PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角  优化响应式标题底部边框:CSS实现技巧与最佳实践  B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】  《画加》约稿流程  百度竞价WAP显示PC链接问题  口腔诊所管理软件推荐  抖音作品被限流怎么办 抖音内容优化与流量恢复方法  RxJS中如何高效地在一个函数内处理和合并多个数据集合  VS Code的时间线(Timeline)视图:您的代码时光机  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  画质怪兽120帧安卓和平精英免费版  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  邮政快递寄件查询入口 邮政快递收件查询入口  b站怎么用微信登录_b站微信登录方法  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  《书耽》更换手机号方法  如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  《大润发优鲜》充值方法介绍  b站如何剪辑视频_b站必剪app使用教程  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  邮编号码查询app有哪些_邮编号码查询推荐app及使用体验  QQ网站入口直接登录 QQ官方正版登录页面  《火影忍者:木叶高手》快速升级攻略  《深林》冬季章节图文攻略  韩剧圈正版官网入口_韩剧圈官方指定登录  顺丰快递单号查询寄件人 顺丰寄件人查询入口  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  C#解析并修改XML后保存 如何确保格式与编码的正确性  告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现  红手指专业版app注册教程  在Dash应用中自定义HTML标题和网站图标  键盘声音异常怎么回事_键盘异响怎么处理  《狐友》联系客服方法  mysql数据库索引类型有哪些_mysql索引类型解析  《偃武》甘宁技能详解 

 2025-11-28

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.