有什么可以做试卷题目的网站/google官方入口

有什么可以做试卷题目的网站,google官方入口,百度上如何发广告,沈阳网站建设技术公司排名目录 友元 友元之普通函数形式 友元之成员函数形式 友元类 友元的特点 友元 什么叫友元? 一般来说,类的私有成员只能在类的内部访问,类之外是不能访问它们的。但如果将其他类/函数设置为类的友元,那么友元类/函数就可以在前…

目录

友元

友元之普通函数形式

友元之成员函数形式

友元类

友元的特点


友元

  • 什么叫友元?

一般来说,类的私有成员只能在类的内部访问,类之外是不能访问它们的。但如果将其他类/函数设置为类的友元,那么友元类/函数就可以在前一个类的类定义之外访问其私有成员了。用friend关键字声明友元

将类比作一个家庭,类的private 成员相当于家庭的秘密,一般的外人当然不允许探听这些秘密的,只有 friend 才有资格探听这些秘密。

友元的三种形式:普通函数、成员函数、友元类

友元之普通函数形式

示例:程序中有Point类,需要求取两个点的距离。按照设想,我们定义一个普通函数distance,接收两个Point对象作为参数,通过公式计算这两个点之间的距离。但Point的_ix和 _iy是私有成员,在类外不能通过对象访问,那么可以将distance函数声明为Point类的友元函数,之后就可以在distance函数中访问Point的私有成员了。

class Point{
public:Point(int x, int y): _ix(x), _iy(y){}
​friendfloat distance(const Point & lhs, const Point & rhs);
private:int _ix;int _iy;
};
​
float distance(const Point & lhs, const Point & rhs){return sqrt((lhs._ix - rhs._ix)*(lhs._ix - rhs._ix) +(lhs._iy - rhs._iy)*(lhs._iy - rhs._iy));
}

image-20240312161218053

友元之成员函数形式

假设类A有一个成员函数,该成员函数想去访问另一个类B类中的私有成员变量。这时候则可以在第二个类B中,声明第一个类A的那个成员函数为类B的友元函数,这样第一个类A的某个成员函数就可以访问第二个类B的私有成员变量了。

我们试验一下,以另一种方式实现上面的需求,如果distance函数不再是一个普通函数,而是Line类的一个成员函数,也就是说需要在一个类(Line)的成员函数中访问另一个类(Point)的私有成员,那么又该如何实现呢?

  • 如果将Point类定义在Line类之前,Line类的成员函数要访问Point类的私有成员,需要在Point类中将Line的这个成员函数设为友元函数——此时编译器并不认识Line类;

  • 如果将Line类定义在Point类之前,那么distance函数需要接受两个const Point &作为参数——此时编译器不认识Point类;

解决方法:

——在Line前面做一个Point类的前向声明;

——但如果将distance的函数体写在Line类中,编译器虽然知道了有一个Point类,但并不知道Point类具体有什么成员,所以此时在函数体中访问_ix、 _iy都会报错,编译器并不认识它们;

思考一下,有什么办法可以解决这个问题呢?

class Point;//前行声明
//只有前向声明,只知道有piont这个类,不知道point是怎么实现的,但不能访问point的内容,那么我们在line类中
//只做函数的声明,不做定义
class Line
{//需要前向声明,使编译器知道有piont这个类public:float destance(const Point &lhs,const Point &rhs);
};
class Point
{public:Point(int x,int y):_ix(x),_iy(y){}//friend friend float Line::destance(const Point &lhs,const Point &rhs);
​private:int _ix;int _iy;
};
​
//point 有什么东西编译器已经知道,现在对destance做定义就可以了,在外面是普通函数,就上作用域
float Line::destance(const Point &lhs,const Point &rhs)
{return sqrt(pow(lhs._ix - rhs._ix ,2)+pow(lhs._iy - rhs._iy,2));
}
 

image-20240312162223639

补充:

前向声明的用处:进行了前向声明的类,可以以引用或指针的形式作为函数的参数,只要不涉及到对该类对象具体成员的访问,编译器可以通过。

(让编译器认识这个类,但是注意如果只进行前向声明,这个类的具体实现没有的话,无法使用这个类的对象,无法创建)

注意:友元的声明要注意和函数的形式完全对应上。

友元类

如上的例子,假设类 Line 中不止有一个 distance 成员函数,还有其他成员函数,它们都需要访问Point 的私有成员,如果还像上面的方式一个一个设置友元,就比较繁琐了,可以直接将 Line 类设置为 Point 的友元类,在工作中这也是更常见的方法。

class Point {//...friend class Line;//...
};

在Point类中声明Line类是本类的友元类,那么Line类中的所有成员函数中都可以访问Point类的私有成员。一次声明,全部解决。

image-20240312163304583

不可否认,友元将类的私有成员暴露出来,在一定程度上破坏了信息隐藏机制,似乎是种“副作用很大的药”,但俗话说“良药苦口”。好工具总是要付出点代价的,拿把锋利的刀砍瓜切菜,总是要注意不要割到手指的。

友元的存在,使得类的接口扩展更为灵活,使用友元进行运算符重载从概念上也更容易理解一些,而且, C++ 规则已经极力地将友元的使用限制在了一定范围内。

友元的特点

  1. 友元不受类中访问权限的限制——可访问私有成员

  2. 友元破坏了类的封装性

  3. 不能滥用友元 ,友元的使用受到限制

  4. 友元是单向的——A类是B类的友元类,则A类成员函数中可以访问B类私有成员;但并不代表B类是A类的友元类,如果A类中没有声明B类为友元类,此时B类的成员函数中并不能访问A类私有成员

  5. 友元不具备传递性——A是B的友元类,B是C的友元类,无法推断出A是C的友元类

  6. 友元不能被继承——因为友元破坏了类的封装性,为了降低影响,设计层面上友元不能被继承

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

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

相关文章

位运算[找出唯一成对的数]

题目来源:蓝桥云课 不用辅助储存空间 import java.util.Random;public class T_01 {public class Util {public static void swap(int[] arr, int i, int j) {int temp arr[i];arr[i] arr[j];arr[j] temp;}public static void print(int[] arr) {for (int i 0; …

7.2 控件和组件

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 C#工具箱位于编辑窗口的左侧,它默认内置了大量的控件和组件。控件一般派生于System.Windows.Forms.Control类,显…

OpenCV第2课 OpenCV的组成结构与图片/视频的加载及展示

1.OpenCV 的组成结构 2.OpenCV 的具体模块 3. 图像的读取 4. 视频的读取 1.OpenCV 的组成结构 OpenCV 是由很多模块组成的,这些模块可以分成很多层: 最底层是基于硬件加速层(HAL)的各种硬件优化。再上一层是opencv_contrib 模块所包含的OpenCV 由其他开发人员所贡献的代…

安装配置Tesseract-OCR

1,下载对应的可执行文件 在Tesseract OCR下载地址Index of /tesseract下载合适的版本安装包,如下: 点击安装包进行安装: 语言选择英文: 如果需要识别中文,则可以在安装过程中勾选下载中文语言包和脚本(也可以按需选择繁体):

关于墙面涂鸦的视觉检测与喷涂修复装置研究(大纲)

公共场所墙面涂鸦视觉检测与精准喷涂修复装置研究 融合视觉识别与自动化喷涂的墙面维护解决方案 第一章 绪论 1.1 研究背景与意义 城市形象与秩序维护: 涂鸦对公共环境的影响(破坏美观、传递不良信息)清除涂鸦的重要性(恢复原貌…

MCP+Hologres+LLM 搭建数据分析 Agent

LLM大模型在数据分析领域的挑战 在数据分析领域,大模型(LLM)具备强大语言理解能力,NL2SQL等各类智能化工具也极大提升了数据分析人员的分析效率,但仍旧面临不少挑战: 传统 LLM 缺乏实时数据接入能力&…

Java高频面试之集合-17

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:JDK 8 对 HashMap 主要做了哪些优化呢?为什么要这么做? JDK 8 对 HashMap 的主要优化及原因 JDK…

iPhone 16如何翻译文档?文档翻译技巧、软件推荐

在全球化的今天,跨语言交流变得越来越频繁,而文档翻译更是成为许多人日常工作和学习中的重要需求。作为苹果公司最新推出的旗舰机型,iPhone 16凭借其强大的硬件性能和丰富的软件生态,为我们提供了多种便捷的文档翻译方式&#xff…

HRP方法全文总结与模型流程解析

背景与问题 传统二次优化方法(如Markowitz的CLA)存在三大问题: 不稳定性:协方差矩阵的高条件数导致逆矩阵计算误差放大,权重剧烈波动。 集中性:优化结果过度集中于少数资产,易受个体风险冲击。…

解决项目一直在构建中的问题:以 IntelliJ IDEA 为例提高共享堆内存

在使用 IntelliJ IDEA 时,开发者可能会遇到项目长期处于构建状态的问题。这种情况将严重影响开发效率。通常,这种问题的一个常见原因是构建进程所分配的堆内存不足。本文将以 IntelliJ IDEA 为背景,介绍如何通过提高共享堆内存来解决此问题&a…

JVM常见概念之条件移动

问题 当我们有分支频率数据时,有什么有趣的技巧可以做吗?什么是条件移动? 基础知识 如果您需要在来自一个分支的两个结果之间进行选择,那么您可以在 ISA 级别做两件不同的事情。 首先,你可以创建一个分支&#xff…

MANISKILL3:GPU 并行机器人模拟和渲染,用于通用的具身AI

本文介绍了一种名为ManiSkill3的机器人仿真系统,它采用了GPU并行化技术,并针对通用性进行了优化。该系统支持多种视觉输入方式和异构模拟,能够在物理场景中进行高效的仿真和渲染,达到比其他平台更快的速度和更少的GPU内存使用量。…

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…

微信小程序中使用Less样式方法

在微信小程序中使用Less样式,可以通过以下步骤实现。主要原理是借助Visual Studio Code(VSCode)的插件将Less文件自动编译为小程序支持的.wxss文件,或通过微信开发者工具的扩展功能直接集成Less编译环境。以下是具体方法&#xff…

SpringBoot星之语明星周边产品销售网站设计与实现

在当今数字化时代,明星周边产品的线上销售已成为一种趋势。幽络源作为一站式综合平台,不仅提供免费源码、网络兼职资源,还分享各类技术教程。本文将详细介绍基于SpringBoot的星之语明星周边产品销售网站的设计与实现,帮助开发者快…

怎样对比找到两个git仓库的差异

怎样对比找到两个git仓库的差异 陈拓 2024/12/24-2024/12/28 1. 概述 要比较两个Git仓库的差异,可以使用git diff命令。你需要先将两个仓库的克隆版本都检出到本地,然后在对应的目录中运行git diff命令。 下面我们以YDLIDAR ROS2驱动程序ydlidar_ros2…

Go常见问题与回答(下)

文章目录 1、通过指针变量 p 访问其成员变量 name,有哪几种方式?2、代码,说出结果3、扩容提,代码,说出结果4、指出下面这段代码的错误之处5、是否通过编译6、关于字符串连接,下面语法正确的是7、关于iota&a…

JVM 核心知识点总结

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

SQL中体会多对多

我们可以根据学生与课程多对多关系的数据库模型,给出实际的表数据以及对应的查询结果示例,会用到JOINLEFT JOIN两种连接 1. 学生表(students) student_idstudent_name1张三2李四3王五 2. 课程表(courses&#xff09…

无人机与传统巡检优劣势对比!

一、无人机巡检的优势 1. 高效性 覆盖范围广:可快速扫描大范围区域(如电力线路、管道、农田等),尤其适合复杂地形(山区、沼泽等)。 速度快:飞行速度远高于人工巡检,缩短任务周期…