类和对象——(6)友元

news2024/9/27 22:36:51

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

一起加油!

目录

一、前言:

二、友元函数: 

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

🔑说明:

 三、友元类:

💦友元类的定义和使用:

🔑说明:

四、总结注意: 

五、共勉: 


一、前言:

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

二、友元函数: 

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

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

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.coloradmin.cn/o/1284276.html

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

相关文章

AntDesign去国际化 | router页面显示问题

删除 Ant Design Pro 中的【国际化】模块报错&#xff1a;Environment key “es2022“ is unknown 问题描述 使用 npm run i18n-remove 运行 “i18n-remove”: “pro i18n-remove --localezh-CN --write” 删除【国际化】模块时出现如下报错&#xff1a; 问题分析 报错的大致…

Android,JNI开发和NDK之间的联系

Android&#xff0c;JNI开发和NDK。 1.jni和ndk jni是在jdk中就有出现的 在我们jdk路径中 D:\java\jdk11\include 这就是jdk中的jni Android开发环境中的ndk也有jni&#xff0c; D:\Android\sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\in…

线程变量引发的session混乱问题

最近不是在救火&#xff0c;就是在救火的路上。 也没什么特别可写的&#xff0c;今天记录下最近遇到的一个问题&#xff0c;个人觉得挺有意思&#xff0c; 待有缘人阅读 言归正传&#xff0c;售后反馈&#xff1a; 营业查询中付款方式为第三方支付的几条银行缴费&#xff0c;创…

Affinity VS PS 2024最新功能详细对比?Affinity Photo与Photoshop比哪家强?

多年来&#xff0c;ps已经有了大量竞争对手。然而每次Photoshop都足以保持其领先地位。开源GIMP和Pixelmator都试图取代Photoshop&#xff0c;不过Photoshop对此不屑一顾。英国Serif公司研发了一款名为Affinity Photo的软件&#xff0c;声称可以叫板ps。今天我们看看有最有可能…

FPGA_单引脚输入输出-三态

FPGA_单引脚输入输出-三态 以常见的I2C协议通讯方式讲解&#xff0c;SDA线既可以接收数据也可以发送数据&#xff0c; I2C 发送写控制命令&#xff0c;在空闲状态时&#xff0c;我们给 I2C 数据方向控制&#xff08;sda_dir&#xff09;信号赋值高电平&#xff0c;将 sda 总线…

编译原理词法分析:正则表达式/正规式转NFA(原理+完整代码+可视化实现)

从正则到自动机&#xff1a;正则表达式/正规式转换为NFA 【本文内容摘要】 &#xff08;1&#xff09;从中缀表达式转换为后缀表达式 &#xff08;2&#xff09;从后缀表达式转换为NFA &#xff08;3&#xff09;打印NFA大致内容 &#xff08;4&#xff09;生成dot文件。 &…

macOS安装JDK8

在这篇博客的基础上进行补充。 https://blog.csdn.net/Sarah_luxy/article/details/128797756 百度搜索jdk8&#xff0c;选择官网进入 下载需要注册账户&#xff0c;提前注册登录 进入到Java SE中 选择下载 选择java归档&#xff0c;在历史版本里找jdk8 下拉找到jdk8 选…

SAAS版专业级条码标签打印软件解决方案

一。新一代互联网打印模式 saas云标签打印软件支持条码、二维码、表格等模式组合打印&#xff0c;支持批量打印标签、表格模拟数据 、在线预览二维码打印 、在线条码生成打印标签 ● 条码/二维码/标签打印&#xff0c;支持表格批量打印标签&#xff1b; ● 条码/二维码尺寸…

Stable Diffusion AI绘画系列【12】:国风美女剑客系列

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

vs查找与替换功能【在文件中查找】不显示任何结果

vs查找与替换功能【在文件中查找】不显示任何结果 vs查找与替换功能【在文件中查找】不显示任何结果1、注册表错误2、窗口重置3、检查查找窗口相关勾选正确吗 vs查找与替换功能【在文件中查找】不显示任何结果 请尝试以下三种方法中的任意一种 1、注册表错误 路径上的【数据】…

maven篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、如何解决依赖传递引起的版本冲突?二、说说maven的依赖原则三、说说依赖的解析机制?四、说说插件的解析机制前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

MYSQL练题笔记-高级查询和连接-简单题3题

写了下面的前3道题。 一、每位经理的下属员工数量 看到题目就知道和之前的至少有5名下属的经理很相似&#xff0c;嘿嘿写对了就不做过多的讲解了。 二、员工的直属部门相关表和题目如下 刚开始觉得很简单&#xff0c;但是仔细想想这道题有两个输出&#xff0c;觉得想不出来&a…

layui+ssm实现数据表格双击编辑更新数据

layui实现数据表格双击编辑数据更新 在使用layui加载后端数据请求时&#xff0c;对数据选项框进行双击即可实现数据的输入编辑更改 代码块 var form layui.form, table layui.table,layer parent.layer undefined ? layui.layer : parent.layer,laypage layui.laypag…

Spring Security 6.x 系列(7)—— 源码分析之Builder设计模式

一、Builder设计模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者&#xff0c;把他们放到一起看看他们的共同特点&#xff1a; 查看AuthenticationManagerBuilder的继承结构图&#xff1a; 查看HttpSecurity的继承结构图&#xff1a; 查看W…

京东数据分析(京东数据运营):2023年10月咖啡市场销售数据分析(商家销量销额店铺数据)

随着我国经济的发展及人们消费观念、消费习惯的变化&#xff0c;咖啡消费越来越成为一种时尚生活方式&#xff0c;国内咖啡市场也在快速增长。且在当前互联网新零售的背景下&#xff0c;线上咖啡市场也愈加繁荣。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年10月…

C# | 使用AutoResetEvent和ManualResetEvent进行线程同步和通信

使用AutoResetEvent和ManualResetEvent进行线程同步和通信 文章目录 使用AutoResetEvent和ManualResetEvent进行线程同步和通信介绍AutoResetEventManualResetEvent 异同点使用场景和代码示例AutoResetEvent 使用示例ManualResetEvent 使用示例阻塞多个线程并同时激活 介绍 在…

【无标题】广东便携式逆变器的澳洲安全 AS/NZS 4763

便携式逆变器的澳洲安全 AS/NZS 4763 便携式逆变器申请澳大利亚和新西兰SAA认证的时候&#xff0c;需要按照澳洲*用标准AS/NZS 4763: 2011进行测试。立讯检测安规实验室有澳洲AS/NZS 4763: 2011资质授权&#xff0c;为国内多家便携式逆变器客户成功申请澳洲SAA证书 便携式户外…

EXCEL中如何替换TRUE和FALSE

问题&#xff1a; 在EXCEL中使用查找/替换时&#xff0c;发现TRUE和FALSE不能被替换成true和false&#xff0c;替换了多次&#xff0c;一点反应都没有。网上提供的方法均是使用公式的大小写转换&#xff0c;但这个显然太麻烦了。通过摸索&#xff0c;找到了一种替换方法。 解…

力扣7.整数反转

题目描述 代码 自己写的像屎山&#xff0c;虽然能通过&#xff0c;但多了很多不必要的代码。 class Solution {public int reverse(int x) {int count 0;int res 0;//用temp2记录x的正负int temp2 x;if(x < 0){x -x;}int temp x;while(temp ! 0){temp temp / 10;cou…

36.位运算符

一.什么是位运算符 按照二进制位来进行运算的运算符叫做位运算符&#xff0c;所以要先将操作数转换成二进制&#xff08;补码&#xff09;的形式在运算。C语言的中的位运算符有&#xff1a; 运算符作用举例结果& 按位与&#xff08;and&#xff09; 0&00; 0&10; …