当前位置: 首页 > 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类的私有成员
}

相关文章:

  • 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任务)
  • 广州某科技公司遭网络攻击,境外“黑手”被锁定
  • 六旬老人举报违建后遭蒙面袭击续:海南陵水县住建局已暂停俩房产项目网签
  • 被央视曝光“废旧厂区沦为垃圾山”,江西萍乡成立调查组查处
  • 无人机企业从科技园区搬到乡村后,村子里变得不一样了
  • 国际观察丨美中东政策生变,以色列面临艰难选择
  • 复旦大学艺术馆开馆:以当代视角再看文科文脉