C++ : 友元

不能从外部访问类的私有数据成员和方法,但这条规则不适用于友元类和友元函数。要声明友元
类或友元函数,可使用关键字 friend,通过让函数成为类的友元,可以赋予该函数与类的成员函数 同的访问权限。
生活中你的家有客厅 (Public) ,有你的卧室 (Private) ,客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去 ,但是呢,你也可以允许你的好闺蜜好基友进去。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为 friend
友元的三种实现:
    全局函数做友元
    类做友元
    成员函数做友元

 全局函数做友元:

class Building
{
public:Building()   //构造函数{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";}
public:string m_SittingRoom; //客厅
private:string m_BedRoom; //卧室
};//全局函数  可以访问类的公有,但想要访问类的私有成员
void goodGay(Building* building)
{cout << "好基友得全局函数正在访问: " << building->m_SittingRoom << endl;cout << "好基友正在访问: " << building->m_BedRoom << endl;    //私有属性在类外访问不到
} void test01()
{Building building;goodGay(&building);
}int main() {test01();system("pause");return 0;
}

怎么解决上述问题?

#include <iostream>
#include <string> 
using namespace std;class Building
{   //goodGay全局函数是 Building好朋友,可以访问Building中私有成员friend void goodGay(Building* building);
public:Building()   //构造函数{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";}
public:string m_SittingRoom; //客厅
private:string m_BedRoom; //卧室
};//全局函数  可以访问类的公有,但想要访问类的私有成员
void goodGay(Building* building)
{cout << "好基友得全局函数正在访问: " << building->m_SittingRoom << endl;cout << "好基友正在访问: " << building->m_BedRoom << endl;    //私有属性在类外访问不到
} void test01()
{Building building;goodGay(&building);
}int main() {test01();system("pause");return 0;
}

类做友元:

#include <iostream>
#include <string> 
using namespace std;//类做友元class Building;
class GoodGay
{
public:GoodGay();void visit();   //参观函数 访问Building的属性Building* building;};class Building
{
public:Building();public:string m_SittingRoom; //客厅
private:string m_BedRoom;//卧室};//类外写成员函数
Building::Building()   //Building的构造函数将内部赋初值
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{//创建建筑物对象building = new Building;   
}void GoodGay::visit()
{cout << "好基友正在访问" << building->m_SittingRoom << endl;}void test01()
{GoodGay gg;   //创建对象  调用 GoodGay的构造函数gg.visit();    //访问
}int main() {test01();system("pause");return 0;
}
//类做友元class Building;
class GoodGay
{
public:GoodGay();void visit();   //参观函数 访问Building的属性Building* building;};class Building
{//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容friend class GoodGay;
public:Building();public:string m_SittingRoom; //客厅
private:string m_BedRoom;//卧室};//类外写成员函数
Building::Building()   //Building的构造函数将内部赋初值
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{//创建建筑物对象building = new Building;   
}void GoodGay::visit()
{cout << "好基友正在访问" << building->m_SittingRoom << endl;cout << "好基友正在访问" << building->m_BedRoom << endl;
}void test01()
{GoodGay gg;   //创建对象  调用 GoodGay的构造函数gg.visit();    //访问
}int main() {test01();system("pause");return 0;
}

成员函数做友元:

//成员函数做友元class Building;
class GoodGay
{
public:GoodGay();void visit();   //让visit函数可以访问Building的私有成员void visit2();  //让visit2函数不可以访问Building的私有成员Building* building;};class Building
{
public:Building();
public:string m_SittingRoom; //客厅
private:string m_BedRoom;//卧室};//类外实现成员函数//类外写成员函数
Building::Building()   //Building的构造函数将内部赋初值
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{//创建建筑物对象building = new Building;
}void GoodGay::visit()
{cout << "好基友正在访问" << building->m_SittingRoom << endl;cout << "好基友正在访问" << building->m_BedRoom << endl;
}void GoodGay::visit2()
{cout << "好基友正在访问" << building->m_SittingRoom << endl;cout << "好基友正在访问" << building->m_BedRoom << endl;
}void test01()
{GoodGay gg;gg.visit();
}int main() {test01();system("pause");return 0;
}

 


class Building;
class GoodGay
{
public:GoodGay();void visit();   //让visit函数可以访问Building的私有成员void visit2();  //让visit2函数不可以访问Building的私有成员Building* building;};class Building
{//告诉编译器 GoodGay类中的visit成员函数 是Building好朋友,可以访问私有内容friend void GoodGay:: visit();public:Building();
public:string m_SittingRoom; //客厅
private:string m_BedRoom;//卧室};//类外实现成员函数//类外写成员函数
Building::Building()   //Building的构造函数将内部赋初值
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{//创建建筑物对象building = new Building;
}void GoodGay::visit()
{cout << "好基友正在访问" << building->m_SittingRoom << endl;cout << "好基友正在访问" << building->m_BedRoom << endl;
}void GoodGay::visit2()
{cout << "好基友正在访问" << building->m_SittingRoom << endl;//cout << "好基友正在访问" << building->m_BedRoom << endl;
}void test01()
{GoodGay gg;gg.visit();
}int main() {test01();system("pause");return 0;
}

下面是21天学通C++对友元的讲述:

不能从外部访问类的私有数据成员和方法,但这条规则不适用于友元类和友元函数。要声明友元
类或友元函数,可使用关键字 friend ,如程序清单 所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/245324.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯每日一题2023.12.4

题目描述 竞赛中心 - 蓝桥云课 (lanqiao.cn) 题目分析 本题使用树型DP&#xff0c;蓝桥杯官网出现了一个点的错误&#xff0c;但实际答案是正确的 状态表示&#xff1a;f[u]&#xff1a;在以u为根的子树中包含u的所有联通块的权值的最大值 假设s1&#xff0c;s2,…sk 是u的…

如何打印社保参保凭证

西安市&#xff1a; 陕西政务服务网&#xff1a; 个人服务 珠海市&#xff1a; 广东政务服务网&#xff1a; 用户登录 | 珠海市人力资源和社会保障网上服务平台 武汉市&#xff1a; 湖北政务服务网&#xff1a; 湖北政务服务网

涵盖多种功能,龙讯旷腾Module第三期:光、磁、力学和极化性质

Module是什么 在PWmat的基础功能上&#xff0c;我们针对用户的使用需求开发了一些顶层模块&#xff08;Module&#xff09;。这些Module中的一部分是与已有的优秀工具的接口&#xff0c;一部分是以PWmat的计算结果为基础得到实际需要的物理量&#xff0c;一部分则是为特定的计…

2024品牌营销为何需要提供“情绪价值”和“感官滋养”?徐礼昭

什么是情绪价值&#xff1f; 品牌营销在当今市场中&#xff0c;已经超越了单纯的产品推广和销售&#xff0c;更多地涉及到提供“情绪价值”和“感官滋养”。 情绪价值是指产品或服务能够引发的消费者情感反应和共鸣&#xff0c;从而满足消费者情感需求的一种价值。它与产品的…

计算机间的通信艺术解析

1*NwzOU-ne2vvobtubtEmBhw.png 网络基础知识 首先&#xff0c;让我们谈谈网络基础知识&#xff0c;即计算机如何彼此通信。 在这种通信的核心是IP地址&#xff0c;它是网络上每个设备的唯一标识符。IPv4地址是32位的&#xff0c;允许大约40亿个唯一地址。然而&#xff0c;随着设…

【ArcGIS Pro微课1000例】0046:深度学习--汽车检测

本实验讲述ArcGIS Pro中人工智能深度学习应用之–汽车检测。 文章目录 一、学习效果二、工具介绍三、案例实现四、注意事项一、学习效果 采用深度学习工具,可以很快速精准的识别汽车。 案例一: 案例二: 下面讲解GIS软件实现流程。 二、工具介绍 该案例演示的是ArcGIS Pro中…

50 代码审计-PHP无框架项目SQL注入挖掘技巧

目录 演示案例:简易SQL注入代码段分析挖掘思路QQ业务图标点亮系统挖掘-数据库监控追踪74CMS人才招聘系统挖掘-2次注入应用功能&#xff08;自带转义)苹果CMS影视建站系统挖掘-数据库监控追踪&#xff08;自带过滤&#xff09; 技巧分析:总结: demo段指的是代码段&#xff0c;先…

练习11-简单卷积器的设计

简单卷积器的设计 1&#xff0c;任务目的&#xff1a;2&#xff0c;明确设计任务2.1,目前这部分代码两个文件没找到&#xff0c;见第5、6节&#xff0c;待解决中。 &#xff0c;卷积器的设计&#xff0c;RTL&#xff1a;con1.v4&#xff0c;前仿真和后仿真&#xff0c;测试信号…

No supported authentication methods available (server sent: publickey) 问题的解决

参考&#xff1a;git clone使用ssh报错: No supported authentication methods available(server sent: publickey) 的解决办法_赵锦川的博客-CSDN博客 No supported authentication methods available (server sent: publickey) 修改&#xff1a;网络的中的SSH设置

用最快的速度了解Python?及入门Python?零基础学习方法汇总。

文章目录 前言1. 将其与类似的语言进行比较。2. 阅读语言的官方文档。3. 使用互联网搜索。4. 与社区接触。5. 编写玩具程序。6. 使用该语言编写 “生产就绪&#xff08;Production-Ready&#xff09;” 的代码。7. 阅读一本关于这门语言的书籍。8. 观看讲座和课程。9. 阅读示例…

沐足采耳店服务预约管理系统会员小程序效果如何

沐足采耳店的很多服务都有较高的市场需求度&#xff0c;如贵妃采耳、太极足疗等&#xff0c;很多城市中都有多个品牌店铺&#xff0c;在如今互联网趋势下&#xff0c;商家们开始借势线上解决传统经营痛点和促进生意发展。 那么通过【雨科】平台搭建沐足采耳店管理小程序能实现…

问题记录-maven依赖升级或替换(简单版)

问题背景 项目被检测到有高危漏洞&#xff0c;需要对部分jar进行升级。以一个jar为例记录一下升级过程。 1 找到高危漏洞的包 如果装了maven helper插件则可以在下面查看当前模块依赖包 2 使用maven命令 执行下面这个命令&#xff0c;会将当前项目的信息打印出来&#xff0c;…