类和对象——(6)友元

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
没有存储汗水,就无法支取成长!

一起加油!

目录

一、前言:

二、友元函数: 

💦例:友元函数的声明与使用——编写一个函数求屏幕上两点之间的距离。

🔑说明:

 三、友元类:

💦友元类的定义和使用:

🔑说明:

四、总结注意: 

五、共勉: 


一、前言:

        类很好地实现了封装和隐藏,一个类里的私有成员和保护成员只能由类内部的成员函数访问外部不能通过对象直接访问。但有时为了提高编程效率,需要允许一个函数或类访问另外一个类中的私有成员或保护成员,这时可将这些类或函数声明为类的友元。        

二、友元函数: 

        可以把函数申明为一个类的友元,函数成为类的友元函数,它就可以访问类中的私有成员和保护成员。

友元函数在被访问类中的声明格式如下:

friend <返回值类型><函数名><(参数表)>;

💦例:友元函数的声明与使用——编写一个函数求屏幕上两点之间的距离。

#include<iostream>
#include<cmath>
using namespace std;
class Point{private:double x;double y;public:Point(double px=0.0,double py=0.0):x(px),y(py){ 	}~Point(){ 	}void print(){cout<<"("<<x<<","<<y<<")"<<endl;	}friend double Distance(Point a,Point b);}; double Distance(Point a,Point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}int main(){Point a(0.0,0.0);Point b(1.0,1.0);a.print();b.print();cout<<"两点距离为:"<<Distance(a,b)<<endl;return 0;
}

🔑说明:

        友元函数可以访问类中里的所有成员,但友元函数并不是类的成员函数,它在类的外部。当函数被声明为类的朋友后,它就成为类的友元函数,相当于类为它打开了一个“后门”,使得在友元函数中访问类的私有成员保护成员不再受到限制。 

 三、友元类:

         友元类的声明方法与友元函数类似,友元类在被访问的类中的声明格式如下:
friend <类名>;

💦友元类的定义和使用:

#include<iostream>
#include<cmath>
using namespace std;
class A{private:double x;double y;public:friend class B;A(int px,int py):x(px),y(py){ 	}~A(){ 	} void print(){cout<<"("<<x<<","<<y<<")";}
};
class B{private:A a1,a2;public:B(A pa1,A pa2):a1(pa1),a2(pa2){ 	}~B(){ 	}void print(){a1.print();a2.print();}double len(A a1,A a2){return sqrt((a1.x-a2.x)*(a1.x-a2.x)+(a1.y-a2.y)*(a1.y-a2.y));}
};int main(){A a1(0.0,0.0);A a2(1.0,1.0);B b(a1,a2);cout<<"线段:";b.print();cout<<"距离:"<<b.len(a1,a2)<<endl;return 0; 
}

🔑说明:

        本例中类 A 描述的是二维坐标系中的一个点,类 B 是线段,在类 B 中有一个获取线段长度的公有方法,通过这个方法可以访问点对象的横纵坐标值(在一般情况下,在类外访问类对象的私有成员值是不允许的)。将类 B 声明为类 A 的友元后,类 B中的所有成员函数会自动变成类 A 的友元函数,就可以访问 A 中的私有成员。

四、总结注意: 

  • 关于友元,需要注意以下几点:
  • 友元关系不能传递。B 类是 A 类的友元,A 类是C 类的友元,如果没有特别声明,不能
    推断 B类是 C类的友元;
  • 友元关系是单向的。B 类是 A 的友元,B 类的成员函数就是 A 类的友元函数,可以访问A类中的私有成员和保护成员。但不能由此推断 A 类也是 B 类的友元,A 类的成员函数不能访问 B 类中的私有成员和保护成员。

五、共勉: 

        以上就是我对类和对象——(6)友元的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对类和对象的理解,请持续关注我哦!!! 

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

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

相关文章

迪文串口5使用查询方式发送数据

迪文屏串口5寄存器如下 发送数据我采用的不是中断&#xff0c;而是查询发送标志位实现的。 串口5不像串口2一样&#xff08;串口2可以位寻址&#xff0c;串口5不行&#xff09;&#xff0c;所以如果采用查询模式&#xff0c;需要判断寄存器的数据&#xff0c;我的写法比较简单…

Web APIs—介绍、获取DOM对象、操作元素内容、综合案例—年会抽奖案例、操作元素属性、间歇函数、综合案例—轮播图定时器版

版本说明 当前版本号[20231204]。 版本修改说明20231204初版 目录 文章目录 版本说明目录复习变量声明 Web APIs - 第1天笔记介绍概念DOM 树DOM 节点document 获取DOM对象案例— 控制台依次输出3个li的DOM对象 操作元素内容综合案例——年会抽奖案例操作元素属性常用属性修改…

整数的立方和

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

Pytest 使用及调用方法

使用python -m pytest调用pytest 2.0版本新增 你可以在命令行中通过Python编译器来调用Pytest执行测试: python -m pytest [...] 通过python调用会将当前目录也添加到sys.path中,除此之外,这几乎等同于命令行直接调用pytest [...]。 可能出现的执行退出code 执行pytest可能…

JCRE-逻辑通道

概述 卡以APDU的形式接收来自CAD的服务请求。JCRE使用SELECT FILE APDU和MANAGE CHANNEL OPEN APDU来指定逻辑通道会话的活动Applet。一旦被选中&#xff0c;一个Applet实例将接收分派到该逻辑通道的所有后续APDU&#xff0c;直到该小程序实例被取消变成Desectected状态。 Ja…

VQD视频质量诊断服务/图像质量诊断/视频流质量诊断/传统方法与深度学习结合的视频质量诊断

随着平安城市、大安防的发展&#xff0c;监控摄像机数量的不断增加&#xff0c;给监控系统的维护工作带来了新的挑战。如何及时了解前端视频设备的运行情况&#xff0c;发现故障并检测恶意遮挡与破坏的不法行为已成为视频监控系统运行的首要迫切问题。对于成千上万个监控摄像机…

d3dx9_43.dll丢失原因以及5个解决方法详解

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“d3dx9_43.dll缺失”。这个错误提示通常表示我们的电脑上缺少了DirectX的一个组件&#xff0c;而DirectX是游戏和多媒体应用所必需的软件。本文将介绍d3dx9_43.dll缺失对电脑的影响以及其原因…

为什么要做ERP集成?ERP系统如何与其他业务应用程序集成

什么是ERP集成&#xff1f; ERP集成是指将企业资源计划&#xff08;Enterprise Resource Planning&#xff0c;ERP&#xff09;系统与其他软件应用或业务流程进行无缝连接和整合的过程。 ERP系统通常涵盖企业内部的各种功能模块&#xff0c;如财务、供应链管理、生产制造、销…

【黑马甄选离线数仓day09_会员主题域开发_DWD和DWM层】

拉链表流程 1.从ODS层获取增量数据(上一天新增和更新的数据) 2.拿着DWD原始拉链表数据 left join 增量数据 ,修改原始拉链中历史数据的结束时间 3.拿着left join 的结果集 union all 增量数据 4.把最新的拉链数据优先保存到DWD对应的临时表中 5.使用insertselect 方式把临时表中…

钉钉聊天审计软件有哪些

钉钉在企业中的广泛应用&#xff0c;聊天审计软件也日益受到关注。这类软件主要针对企业微信、钉钉等即时通讯工具&#xff0c;对其中的聊天记录进行审计&#xff0c;以便企业能够更好地管理员工的在线行为&#xff0c;并保障信息安全。 一、聊天审计软件的作用 1、监管员工行…

12.4 C++ 作业

完成沙发床的多继承 #include <iostream>using namespace std;//封装 沙发 类 class Sofa { private:string *sitting; public://无参构造函数Sofa(){cout << "Sofa::无参构造函数" << endl;}//有参构造函数Sofa(string s):sitting(new string(s)…

JDBC简介及快速入门-黑马(P1)

黑马视频b站链接&#xff1a; 01-JDBC简介&快速入门_哔哩哔哩_bilibili &#x1f436;一、JDBC 简介 JDBC 概念&#xff1a; JDBC 就是使用 Java 语言操作关系型数据库的一套 API。 全称&#xff08;Java DataBase Connectivity&#xff09; Java 数据库连接 JDBC 本质…