【c++】cpp类的友元函数和友元类(friend关键字)

(1)友元函数

全局函数:void setA1(A1 *p, int a1);

在类内部声明为友元函数:friend void setA1(A1 *p, int a1);

友元函数的作用:在类的内部将一个外部函数声明一个友元函数后,该外部函数调用该类对象时可以访问私有成员变量。

示例代码:

#include <iostream>class Student
{
public:Student(){grade = 60;age = 18;}int GetGrade(){return this->grade;}//声明一个友元函数,这个函数是这个类的好朋友friend void ChangeGrade(Student *p, int grade);
protected:
private:int grade;int age;
};void ChangeGrade(Student *p, int grade)
{p->grade = grade; //如果没有友元函数,将无法访问私有成员
}int main()
{Student stu1;// 私有成员不可直接访问// std::cout << stu1.grade << std::endl;  // 通过类的内部访问私有成员std::cout << stu1.GetGrade() << std::endl; //60 //通过友元函数 修改类的私有属性ChangeGrade(&stu1, 100); std::cout << stu1.GetGrade() << std::endl;  //100return 0;
}

(2)友元类

如何声明:在A的内部声明B是A的友元类:friend class B;

声明位置有无要求:声明的位置 和 public private没有关系。

友元类作用

  • 若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数(也就是可以通过B类的内部函数来操作A类)。
  • 友员类通常设计为一种对数据操作或类之间传递消息的辅助类。

示例代码:

#include <iostream>class Boy
{
public:// 友元类,GirlFriend类 是 Boy的好朋友friend class GirlFriend;// 在GirlFriend中可以访问Boy类的私有成员 私有函数// 声明的位置 和 public private没有关系// 友元函数friend void modify_salary(Boy *p, double salary);
public:    Boy(int age = 0, int face = 0){this->face = face;this->age = age;this->asset = 0;this->salary = 0;this->height = 180;}
public: double get_asset(){return this->asset;}double get_salary(){return this->salary;}
private:double asset;double salary;double height;int age;int face;
};void modify_salary(Boy *p, double salary)
{p->salary = salary;
}class GirlFriend
{
public:GirlFriend(int age, int face):other_boy(9, 180){this->age = age;this->face = face;}
public:void add_boy_asset(Boy &boy, double asset){boy.asset += asset; // boy是可以操作的友元对象}void transfer_boy_asset(Boy &boy, double asset){boy.asset -= asset; // boy是可以操作的友元对象other_boy.asset += asset; // other_boy是GirlFriend的成员}void print_boy_asset(Boy &boy){std::cout << "boy asset=" << boy.asset << std::endl;std::cout << "other_boy asset=" << other_boy.asset << std::endl;}double get_otherboy_asset(){return other_boy.asset;}
private:int age;int face;Boy other_boy;
};int main()
{// 创建一个Boy对象Boy boy_tom(18, 8);std::cout << boy_tom.get_asset() << std::endl; // 0// 通过GirlFriend类来操作Boy类的属性等GirlFriend gf(18, 6);gf.print_boy_asset(boy_tom);// boy asset=0// other_boy asset=0gf.add_boy_asset(boy_tom, 10000);std::cout << boy_tom.get_asset() << std::endl; // 10000std::cout << gf.get_otherboy_asset() << std::endl; // 0gf.transfer_boy_asset(boy_tom, 5000);gf.print_boy_asset(boy_tom);// boy asset=5000// other_boy asset=5000// 通过友元函数操作Boy对象modify_salary(&boy_tom, 3000);std::cout << boy_tom.get_salary() << std::endl; // 3000return 0;
}

end

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

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

相关文章

数据变更捕获 (CDC):PostgreSQL 与 ClickHouse - 第一部分

本文字数&#xff1a;13442&#xff1b;估计阅读时间&#xff1a;34 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 简介 在之前的文章中&#xff0c;我们已经讨论了OLTP数据库&#xff08;例如Postgres&#xff09;和OLAP数据…

【go零基础】go-zero从零基础学习到实战教程 - 1项目表设计

既然是0基础&#xff0c;现在来写下设计思路&#xff0c;因为go-zero是个微服务架构&#xff0c;所以&#xff0c;哪怕是0基础&#xff0c;也从两个服务模块开始写起。 我们的目标是&#xff1a;最小可用微服务架构最佳实践&#xff01; 好了&#xff0c;饼画完了。 第0部分写到…

Java23种设计模式-结构型模式之装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;&#xff1a;动态地给一个对象添加一些额外的职责。这种模式提供了一种灵活的方式来扩展对象的功能&#xff0c;而不需要修改原始类的代码 通常有以下角色&#xff1a; 角色1.抽象组件&#xff08;Component&#xff09;&a…

504网关超时可能是哪些原因导致

当前随时互联网的发展普及&#xff0c;我们经常会使用到网站服务&#xff0c;许多网站为了提高打开速度&#xff0c;都会接入使用CDN。当我们在浏览网页或使用网络服务时&#xff0c;有时候可能有遇到网站打不开的情况&#xff0c;出现各式各样的错误代码&#xff0c;其中504网…

【注解和反射】通过反射动态创建对象、调用普通方法、操作属性

继上一篇博客【注解和反射】获取类运行时结构-CSDN博客 目录 八、通过反射动态创建对象 测试&#xff1a;通过反射动态创建对象 思考&#xff1a;难道没有无参的构造器就不能创建对象了吗?只要在操作的时候明确的调用类中的构造器并将参数传递进去之后&#xff0c;才可以实…

bundle的下载和使用

1.bundle 的概要 BundleBundle 是一个嵌入式压缩库&#xff08;嵌入是指直接嵌入到代码中&#xff0c;可以直接使用无需编译&#xff09;&#xff0c;支持 23 种压缩算法和 2 种存档格式。 2.bundle 的使用 使用的时候只需要手动拷贝添加两个 bundle.h 和 bundle.cpp 文件即…

三维图形程序员必学-CGAL几何算法

GCAL几何算法库,涵盖了很多数学几何算法,矩阵运算、平面拟合、曲线拟合、曲面重建、网格优化、网格剖分、面线相交、布尔运算等等各种图形学几何相关的算法。 文章最后放了一个CGAL求点集拟合平面,投影求线的例子代码。 CGAL是一个开源代码库,官网连接GitHub - CGAL/cgal…

网络安全之弱口令与命令爆破(上篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;使用Burpsuite工具弱口令爆破 总结 一&#xff0c;什么是弱口令&#xff1f; 弱口令就是容易被人们所能猜到的密码呗&#xff0c;…

Linux动态追踪——eBPF

目录 摘要 1 什么是 eBPF 2 eBPF 支持的功能 3 BCC 4 编写脚本 5 总结 6 附 摘要 ftrace 和 perf 与 ebpf 同为 linux 内核提供的动态追踪工具&#xff0c;其中 ftrace 侧重于事件跟踪和内核行为的实时分析&#xff0c;perf 更侧重于性能分析和事件统计&#xff0c;与…

脚本:监控Oracle中正在运行的SQL

这是我自己平时用的一个监控Oracle中正在运行的SQL的脚本&#xff0c;有需要的请收藏&#xff0c;运行时直接复制和粘贴即可。 col inst_sid heading "INST_ID|:SID" format a7 col username format a10 col machine format a12 col sql_exec_start heading "…

vim+xxd 编辑16进制

1. vim -b mib 2. 在vim 中执行 %!xxd, 这样就可以输入16进制&#xff1a; 3. 输入完成后&#xff0c;在vim中 执行 %!xxd -r 切换至原模式&#xff1b; 4. 保存退出即可 5. 重新打开mib文件&#xff1a;vim -b mib 6. 在vim 中执行 %!xxd, 查看是否符合预期&#xff1a;…

c++实战篇(二)——基于自旋锁实现的日志服务模块

前言 日志模块一直是服务端开发比较重要的部分,而在实际应用中向日志中进行写入的操作往往不是单线/进程的&#xff0c;而在多进/线程中如何实现对共享资源的保护&#xff0c;就成了一个比较重要的问题,而在实际开发中我们常常会利用锁机制来实现对共享内存的保护&#xff0c;…

学习java第五十一天

解释不同方式的自动装配 。 有五种自动装配的方式&#xff0c;可以用来指导 Spring 容器用自动装配方式来进行依赖注入。 no&#xff1a;默认的方式是不进行自动装配&#xff0c;通过显式设置 ref 属性来进行装配。 byName&#xff1a;通过参数名 自动装配&#xff0c;Spring 容…

如何理解GDP、国民总收入(GNI)的区别和联系

国内生产总值和国民总收入是衡量一个国家&#xff08;地区&#xff09;经济状况和发展水平的两个重要总量指标。两者既有密切的联系&#xff0c;又有一定区别&#xff0c;用途都非常广泛。 一、GDP与GNI的基本概念 国内生产总值(Gross Domestic Product&#xff0c;GDP)&…

遇到PHP方法 二维数组随机排序shuffle 二维数组筛选搜索array_filter

在做二维数组随机排序的时候&#xff0c;发现shuffle 函数挺好用&#xff0c;就不用在做负载的数组随机排序了&#xff0c;对于二维数组同样可以随机排列 php中的shuffle()函数是一个非常有用的函数&#xff0c;常用于随机重排数组中的元素。这个函数可以在很多开发场景中&…

一个联合均值与方差模型的R包——dglm

目录 一、引言二、包的安装与载入三、模拟例子3.1 数据生成3.2 数据查看3.3 模型估计参数 一、引言 在 R 语言中&#xff0c;dglm 包是用于拟合双参数广义线性模型&#xff08;Double Generalized Linear Models&#xff0c;简称 DGLMs&#xff09;的一个工具。这类模型允许同…

模块三:二分——162.寻找峰值

文章目录 题目描述算法原理解法一&#xff1a;暴力查找解法二&#xff1a;二分查找 代码实现解法一&#xff1a;暴力查找解法二&#xff1a;CJava 题目描述 题目链接&#xff1a;162.寻找峰值 根据题意&#xff0c;需要使用O(log N)的时间复杂度来解决&#xff0c;得出本道题…

.rmallox勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言&#xff1a; 在当今数字化的时代&#xff0c;计算机病毒已成为网络安全的一大威胁。其中&#xff0c;.rmallox勒索病毒以其高度的隐蔽性、快速的传播速度、巨大的危害性和不断变种的特性&#xff0c;引起了广大用户的关注。本文将详细解析.rmallox勒索病毒的特点&#xf…

在美国站群服务器部署时如何保障从253个IP到1000个IP的无缝扩展?

在美国站群服务器部署时如何保障从253个IP到1000个IP的无缝扩展? 在当今企业的数字化转型中&#xff0c;服务器的部署和管理成为了保证业务连续性和拓展性的关键。尤其对于站群服务器来说&#xff0c;随着企业业务的增长和市场的扩展&#xff0c;需要从较小规模的253个IP地址…

AWTK 异形进度条控件发布

异形进度条控件。通过多边形来定义进度条的形状。 代码地址&#xff1a;https://gitee.com/zlgopen/awtk-widget-progress-polygon 特性 通过多边形定义进度条的形状支持通过图片来定义进度条的背景支持通过图片来定义进度条的前景 使用图片填充比使用颜色填充消耗更多的内…