当前位置: 首页 > news >正文

C++类与对象--4 友元

友元的目的,是让一个函数或一个类,可以访问另一个类的私有成员

友元的三种实现

  1. 全局函数做友元
  2. 类做友元
  3. 成员函数做友元

4.1 全局函数做友元

  • 全局函数访问类的私有成员
class Build
{friend void g_func(Build & build); // 在类中做全局函数的声明,并在前面加关键字friendpublic:std::string m_SittingRoom;
private:std::string m_BedRoom;
};
​
void g_func(Build & build) // 全局函数定义
{std::cout << build->m_BedRoom << std::endl; // 访问类的私有成员
}

4.2 类做友元

  • 类访问另一个类的私有成员-->类中所有成员函数可以访问另一个类的私有属性
class Build;    // 类声明,在类FriendOfBuild中使用Build类型
​
class FriendOfBuild
{
public:Build * build;  // Build对象做成员属性FriendOfBuild();void visit();
};
​
FriendOfBuild::FriendOfBuild()
{build = new Build;
}
​
class Build     // Build类定义在FriendOfBuild类后,使“friend class FriendOfBuild;”不报错
{friend class FriendOfBuild;     // 表示FriendOfBuild类可以访问Build类的私有成员
public:std::string m_SittingRoom = "客厅";Build();
private:std::string m_BedRoom = "卧室";
};
​
void FriendOfBuild::visit() // 成员函数的类外实现
{std::cout << build->m_SittingRoom << std::endl;std::cout << build->m_BedRoom << std::endl; // FriendOfBuild类访问Build类的私有成员
}

4.3 成员函数做友元

  • 一个类的成员函数访问另一个类的私有成员-->其他成员函数不能访问另一个类的私有属性
class Build;    // 类声明,在类FriendOfBuild中使用Build类型
​
class FriendOfBuild
{
public:Build * build;  // Build对象做成员属性FriendOfBuild();void visit();void visit2();
};
​
FriendOfBuild::FriendOfBuild()
{build = new Build;
}
​
class Build     // Build类定义在FriendOfBuild类后,使“friend class FriendOfBuild;”不报错
{friend void FriendOfBuild::visit();     // 表示FriendOfBuild类的成员函数visit()// 可以访问Build类的私有成员,但成员函数// visit2()不能访问Build类的私有成员。
public:std::string m_SittingRoom = "客厅";Build();
private:std::string m_BedRoom = "卧室";
};
​
void FriendOfBuild::visit()
{std::cout << build->m_SittingRoom << std::endl;std::cout << build->m_BedRoom << std::endl; // FriendOfBuild类访问Build类的私有成员
}

http://www.dtcms.com/a/200407.html

相关文章:

  • Linux利用多线程和线程同步实现一个简单的聊天服务器
  • stata入门学习笔记——导入数据
  • GPFS故障实际生产故障处理分析
  • Node.js聊天室开发:从零到上线的完整指南
  • 使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件
  • Assistants API
  • es在已有历史数据的文档新增加字段操作
  • Python編譯出exe如何掛載到工作排程器上
  • VTK|显示三维图像的二维切片
  • Pyro:基于PyTorch的概率编程框架
  • 哈夫曼编码:数据压缩的优雅艺术
  • 使用PHP对接东南亚、日本、印度和印度尼西亚股票数据源
  • 洛谷U536262 井底之“鸡” 附视频讲解
  • WEB安全--SQL注入--Oracle注入
  • 【VMware】虚拟机运行 Linux Ubuntu、MAC 安装和配置
  • oracle序列自增问题
  • 如何在 Windows 11 或 10 上安装 Django
  • Springboot 跨域拦截器配置说明
  • 已知6、7、8月月平均气温和标准差,求夏季季平均温度与标准差
  • 《Opensearch-SQL》论文精读:2025年在BIRD的SOTA方法(Text-to-SQL任务)
  • LightRAG 由入门到精通
  • leetcode刷题日记——对称二叉树
  • 使用腾讯云高性能空间部署YOLOv11训练模型
  • C/C++ 知识点:引用临时对象
  • JavaScript篇:前端模块化进化史:从CommonJS到ES6的奇幻之旅
  • Python Django 的 ORM 编程思想及使用步骤
  • 通过vcpkg交叉编译grpc:构建Arm64平台的Docker化开发环境
  • ALTER AGGREGATE使用场景
  • JSON-to-Excel插件 v2.1.2 新增功能批量转换功能
  • 2025毕业论文与答辩资料精选汇总