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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

奥本海默-电影剧情简介

片头&#xff0c;奥本海默 脑海浮现恒星生命周期画面 1925年&#xff0c;奥本海默离开美国去欧洲学习新物理&#xff08;量子力学&#xff09; 脑海浮现量子力学相关画面&#xff08;像 德布罗意波&#xff09; 1927年从德国哥廷根大学毕业&#xff0c;获得物理学博士学位。…

MySQL笔记-第04章_运算符

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第04章_运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 运算符的优先级拓展&#xff1a;使用正则表达式查询 第04章_运算符 …

计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测

文章目录 计算机辅助药物设计AIDD【小分子专题】AIDD概述及药物综合数据库学习机器学习辅助药物设计图神经网络辅助药物设计自然语言处理辅助药物设计药物设计与分子生成 计算机辅助药物设计【蛋白质专题】蛋白质数据结构激酶-Kinase相似性学习基于序列的蛋白质属性预测基于结构…

【Windows】使用SeaFile搭建本地私有云盘并结合内网穿透实现远程访问

1. 前言 现在我们身边的只能设备越来越多&#xff0c;各种智能手机、平板、智能手表和数码相机充斥身边&#xff0c;需要存储的数据也越来越大&#xff0c;一张手机拍摄的照片都可能有十多M&#xff0c;电影和视频更是按G计算。而智能设备的存储空间也用的捉襟见肘。能存储大量…

使用typescript搭建express

使用typescript搭建express 开始 为这个项目创建一个新的目录&#xff0c;使用下面的命令初始化项目并创建一个包。 NPM init -y初始化后&#xff0c;让我们安装必要的包 npm i express dotenv cors helmet body-parser 在express中配置typescript npm i -D typescript typ…

filter过滤器

package com.it.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter;import java.io.IOException;WebFilter(urlPatterns"/*") public class DemoFilter implements Filter {Override // 初始化的方法 只要调用一次public void init(Filte…

【React 开发】增强你的React 技能:2024年要掌握的4种高级模式

React由于其简单和灵活&#xff0c;近年来已成为最受欢迎的前端库之一。然而&#xff0c;当应用程序的复杂性扩展时&#xff0c;管理状态、处理异步输入和维护可扩展的体系结构可能会变得困难。我们将在本文中介绍四种高级React模式&#xff0c;它们将帮助您克服这些困难以及如…

(C语言)判定一个字符串是否是另一个字符串的子串,若是则返回子串在主串中的位置。

要求&#xff1a; &#xff08;1&#xff09;在主函数中输入两个字符串&#xff0c;调用子函数cmpsubstr()判断&#xff0c;并在主函数输出结果。 &#xff08;2&#xff09;子函数的返回值为-1表示未找到&#xff0c;否则返回子串的位置&#xff08;起始下标&#xff09;。 …

人工智能-A*算法-八数码问题

一&#xff0c;A*算法设计思想 A*算法&#xff08;A-star&#xff09;是一种寻路算法&#xff0c;主要用于游戏、机器人等领域。 它的设计思想是将最短路径搜索问题转化为一个优化问题&#xff0c;通过计算每个节点的评分&#xff08;f(n) g(n) h(n)&#xff09;来寻找最优…

YOLOv8-Seg改进:简单高效的模块-现代反向残差移动模块 (iRMB) | | ICCV2023 EMO

🚀🚀🚀本文改进:设计了一种面向移动端应用的简单而高效的现代反向残差移动模块 (Inverted Residual Mobile Block, iRMB),它吸收了类似 CNN 的效率来模拟短距离依赖和类似 Transformer 的动态建模能力来学习长距离交互,引入YOLOV8 🚀🚀🚀YOLOv8-seg创新专栏:h…

【华为OD题库-064】最小传输时延I-java

题目 某通信网络中有N个网络结点&#xff0c;用1到N进行标识。网络通过一个有向无环图.表示,其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[]{u&#xff0c;v&#xff0c; w)&#xff0c;其中u表示源结点&#xff0c;v表示目的结点&#xff0…

小程序长按识别二维码

小程序开发中要实现长按识别二维码的功能很简单&#xff0c;只需要在image标签里添加如下属性即可&#xff1a; 小程序版本&#xff1a; show-menu-by-longpress"{{true}}" uniapp版本&#xff1a; :show-menu-by-longpress"true" 举例&#xff1a; …

金融银行业更适合申请哪种SSL证书?

在当今数字化时代&#xff0c;金融行业的重要性日益增加。越来越多的金融交易和敏感信息在线进行&#xff0c;金融银行机构必须采取必要的措施来保护客户数据的安全。SSL证书作为一种重要的安全技术工具&#xff0c;可以帮助金融银行机构加密数据传输&#xff0c;验证网站身份&…

网页文章采集工具-人工智能AI功能

简数采集器是一款支持人工智能AI功能的网页文章采集工具&#xff0c;它可以调用百度的文心一言AI对采集的数据进行分析&#xff0c;处理&#xff0c;内容创作等等&#xff0c;根据你的需求进行更加灵活的数据采集和处理。 文心一言人工智能AI功能使用方法&#xff1a; 1. 填写…

什么是Overlay网络?Overlay网络与Underlay网络有什么区别?

你们好&#xff0c;我的网工朋友。 在传统历史阶段&#xff0c;数据中心的网络是以三层架构&#xff08;核心、汇聚、接入&#xff09;为基本标准。 但是随着技术的发展&#xff0c;不同的厂家有不同的组建方式&#xff0c;比如说在核心层、汇聚层和接入层增加虚拟化技术。 …

MySQL笔记-第05章_排序与分页

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第05章_排序与分页1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 第05章_排序与分页 讲师&#…

Allegro无法模块复用的解决办法

Allegro无法模块复用的解决办法 在用Allegro做PCB设计的时候,模块复用是使用的比较频繁的功能,对于有相同模块的单板,可以节省大量的时间。 模块复用的功能不细说,具体参考以前的文章。 有时会遇到模块复用的时候出现如下报错 无法匹配,有时如果因为Device而无法复用,就…

学习pytorch16 现有网络模型的使用和修改

现有网络模型的使用和修改 官网 [https://pytorch.org/](https://pytorch.org/)torchvison 相关model1. 图像常用vgg16模型 【vgg19也常用】2. ImageNet数据集太大 无法代码下载 kaggle网址下载3. 代码4. 执行结果 官网 https://pytorch.org/ torchvison 相关model 1. 图像常用…

Android wifi 框架以及Enable流程

Android P相比于Android O的变化 多了WifiStateMachinePrime&#xff08;状态机的前处理机制&#xff09;&#xff0c;wifiService的相关cmd 不再是直接send 给WifiStateMachine&#xff0c;而是被送到WifiStateMachinePrime先进行处理后&#xff0c;再送往WifiStateMachine也…

Linux Namespace技术

对应到容器技术&#xff0c;为了隔离不同类型的资源&#xff0c;Linux 内核里面实现了以下几种不同类型的 namespace。 UTS&#xff0c;对应的宏为 CLONE_NEWUTS&#xff0c;表示不同的 namespace 可以配置不同的 hostname。User&#xff0c;对应的宏为 CLONE_NEWUSER&#xf…