Cherno C++学习笔记 P46 箭头运算符

这一篇文章我们讲一下箭头运算符的使用。在之前的一些场景下,我们已经使用到了箭头运算符,这次我们可以更深入的聊一下箭头运算符应该如何使用,以及我们如何实现自己的箭头指针。

我们还是以一个最简单的Entity类举例:

class Entity {
public:void Print() {std::cout << "Hello World!" << std::endl;}
};

然后我们随便new一个指针:

Entity* ptr = new Entity;

但是我们需要注意的是,如果我们想要通过这个指针来调用Entity类当中的Print函数,如果还按照之前我们实例化对象调用函数的方法,其实是行不通的,比如写成这样是会报错的:

ptr.Print();

因为我们现在的ptr并不是一个实例化的对象,它只是一个指针,所以这样使用“.”是会错误的,如果想要用“.”,我们需要先对指针进行dereference然后再调用这个函数:

(*ptr).Print();

但是我们可以看到,这样写其实并不直观,那么有没有一种更加直观的办法来表示?那当然是有的,就是箭头运算符:

ptr->Print();

这样我们就可以直接通过指针来调用这个方法了。这其实是一个快捷符号。

需要注意的是,->其实是一个运算符,而我们可以重载这个运算符的。

为什么我们要重载这个运算符?答案也很简单,因为在我们自己实现作用域指针的时候,如果我们还沿袭原有的对于->的定义,会意识到代码写起来会非常奇怪,比如我们实现这样一个ScopedPtr类:

class ScopedPtr {
private:Entity* ptr;
public:ScopedPtr(Entity* ptr):ptr(ptr){}Entity* GetObject() {return ptr;}~ScopedPtr() {delete ptr;}
};

 那么在我们实例化了一个ScopedPtr的对象之后,如果我们想要用这个对象去调用Entity当中的函数,就会出现一个很麻烦的事情:我们需要访问ScopedPtr类的private变量才能够获得Entity类的指针!也就是说,我们要绕很大一圈才能调用Entity的函数,如果我们写出来就是这个样子的:

ptr.GetObject()->Print();

这个明显是非常麻烦的,我们希望我们自己定义的指针类是在能拥有普通new指针的全部好处的前提下,最好再可以自动销毁,而不是给我们带来这么多的困扰。所以我们需要可以重载我们的箭头运算符,能让它像普通指针一样直接访问Entity类当中的方法。
具体的使用方法如下:

Entity* operator->() {return ptr;
}

然后我们就可以发现,我们会像使用普通new指针一样使用ScopedPtr类的指针了!而且还有了可以自动销毁的功能。

ScopedPtr ptr = new Entity;
ptr->Print();

当然如果有需要的话,我们还可以有一个返回const指针的版本。

const Entity* operator->() const {return ptr;
}

但是需要注意的是,如果我们返回的是const指针,那么我们也应该只能调用const方法。通过我们这样设计重载箭头运算符,我们成功地让我们的代码保持整洁,看起来非常的nice。

除了这些之外,箭头运算符还有一个神奇的功能,那就是获取偏移量。比如我们定义这样一个三维向量的结构:

struct Vector3 {float x, y, z;
};

很简单的一个向量类,然后我们想要获取变量x,y,z关于我们对Vector3指针的偏移量,该如何获得?也就是说,如果我们有一个Vector3指针,它会指向某一个位置,但是其中的成员变量x,y,z也有自己在内存中的位置,那么成员变量的位置相对于struct指针指向的位置差了多少?我们可以用下面的语句来获得:

int offset = (int)&((Vector3*)nullptr)->x;
std::cout << offset << std::endl;

这句话具体是什么含义?也不难理解,我们首先将一个空指针强制转换成Vector3指针,也就是说我们让这个Vector3指针指向了0位置,然后我们取x,再对它取值,就是x相关于Vector3指针的位置了,至于转成int那无非就是方便输出给我们看。输出之后,我们可以发现这个值为0。同理我们可以把x换成y和z,然后会发现结果分别是4和8。

好了,以上就是全部有关于箭头运算符的内容了,希望大家能够喜欢!

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

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

相关文章

WWW23-多行为级联|级联图卷积网络的多行为推荐

论文&#xff1a;https://arxiv.org/abs/2303.15720 代码&#xff1a;https://github.com/SS-00-SS/MBCGCN 这篇论文MB-CGCN和上一篇CRGCN是同一个团队的&#xff0c;都是级联的方式。一个用了残差&#xff0c;一个用了特征转换&#xff0c;文章最后有discussion讨论了两者的不…

JAVA开发入门学习七- 数组

数组的概念 概念 数组&#xff1a; 是多个相同类型数据按照一定排列的集合&#xff0c;并使用一个名字命名&#xff0c;并通过编号的方式对这些数据进行统一管理 数组中的概念 数组名&#xff1a; 数组的名称&#xff0c;命名 下标&#xff1a; 从0开始 元素&#xff1a;…

【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹

代码 [MenuItem("Assets/Open Explorer/PersistentDataPath")]public static void OpenPersistentDataPath(){Application.OpenURL(Application.persistentDataPath);}[MenuItem("Assets/Open Explorer/DataPath")]public static void OpenDataPath(){Appl…

链路聚合与GVRP的混合构建(eNSP)

目录 拓扑图&#xff1a; 前置操作&#xff1a; GVRP全局开启&#xff1a; 查询&#xff1a; 实验背景&#xff1a;前面依次搭建了交换机的链路聚合实验手册以及动态vlan GVRP&#xff0c;为了模拟真实环境&#xff0c;本次实验将两者结合。 拓扑图&#xff1a; 前置操作&…

由于这些关键原因,我总是手边有一台虚拟机

概括 虚拟机提供了一个安全的环境来测试有风险的设置或软件,而不会影响您的主系统。设置和保存虚拟机非常简单,无需更改主要设备即可方便地访问多个操作系统。运行虚拟机可能会占用大量资源,但现代 PC 可以很好地处理它,为实验和工作流程优化提供无限的可能性。如果您喜欢使…

华为ensp--BGP路由反射器

学习新思想、争做新青年&#xff0c;今天学习的是BGP路由反射器。 实验目的 理解BGP路由反射器的应用场景 理解BGP路由反射器的工作原理 掌握BGP路由反射器的基本配置方法 实验内容 本实验网络包含了两个AS&#xff0c;两个Cluster。R1、R2、R3属于Cluster 1&#xff0c…

使用idea创建JDK8的SpringBoot项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 使用idea创建JDK8的SpringBoot项目 前言我们经常在创建新的springboot项目&#xff0c;默认使用的是spring.io进行创建&#xff0c;但是它总是只会提供高版本的创建方式&…

初学stm32 --- 定时器中断

目录 时钟选择&#xff1a; 内部时钟选择​编辑 时钟计算方法&#xff1a; 计数器模式 向下计数模式&#xff08;时钟分频因子1&#xff0c;ARR36&#xff09; 向上计数模式&#xff08;时钟分频因子1&#xff0c;ARR36&#xff09; 中央对齐计数模式&#xff08;时钟分频因…

windows下安装配置anaconda及常用的conda命令

Anaconda极大的简化了Python环境和库的管理&#xff0c;其最大的作用就是可以创建、管理多个不同python版本的虚拟环境&#xff0c;起到不同环境相互隔离、互不干扰、避免环境冲突的目的。如果使用本地Python安装多个包&#xff0c;经常会遇到包冲突&#xff0c;导致整个python…

安装CPU版的torch(清华源)

1、安装指令&#xff1a; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2、验证torch是否安装成功 // 使用python验证 import torch print(torch.__version__)能正常打印版本即表示安装成功&#xff0c;如下图

ASP.NET Core Web API 控制器

文章目录 一、基类&#xff1a;ControllerBase二、API 控制器类属性三、使用 Get() 方法提供天气预报结果 在深入探讨如何编写自己的 PizzaController 类之前&#xff0c;让我们先看一下 WeatherController 示例中的代码&#xff0c;了解它的工作原理。 在本单元中&#xff0c…

【蓝桥杯——物联网设计与开发】基础模块8 - RTC

目录 一、RTC &#xff08;1&#xff09;资源介绍 &#x1f505;简介 &#x1f505;时钟与分频&#xff08;十分重要‼️&#xff09; &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、RTC接口…

k8s dashboard可视化操作界面的安装

一、官方安装方法 根据官网的安装配置可以选择如下安装&#xff1a; kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml 二、添加阿里云加速进行安装 #修改recommended.yaml拉取镜像的链接 vim recommended.yam…

【目标跟踪综述及关键技术】

1.多目标跟踪任务介绍 定义 多目标跟踪旨在将视频序列中感兴趣的目标检测出来&#xff0c;并赋予每个目标单独的编号&#xff0c;在整个序列中形成目标的轨迹。 分类 online&#xff1a;算法在推理目标身份过程中&#xff0c;只能看见当前帧以及之前的帧&#xff08;关联&a…

webrtc音频模块(三) windows Core Audio API及声音的播放

在前面介绍了ADM(Audio Device Module)&#xff0c;它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode&#xff0c;它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API&#xff0c;比如最常…

在linux系统的docker中安装GitLab

一、安装GitLab&#xff1a; 在安装了docker之后就是下载安装GitLab了&#xff0c;在linux系统中输入命令&#xff1a;docker search gitlab就可以看到很多项目&#xff0c;一般安装第一个&#xff0c;它是英文版的&#xff0c;如果英文不好可以安装twang2218/gitlab-ce-zh。 …

uniapp跨平台开发---webview调用app方法

1.app端实现 注意:为了实现实时通信,app端页面是.nvue 代码实现 <template><view class"content"><view class"web-view"><web-view class"web-view" :src"url" ref"webview" onPostMessage"o…

LeetCode 343.整数拆分

1.题目要求: 2.题目代码: class Solution { public:int integerBreak(int n) {//先确定dp数组vector<int> dp;//1.确定dp数组的含义//2.确定dp的递推公式//3.初始化dp数组//4.遍历顺序dp.resize(n 1);dp[0] 0;dp[1] 0;dp[2] 1;for(int i 3;i < n;i){for(int j …

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的&#xff0c;但是我们前面接触的文件都是系统中的文件&#xff0c;都是已经在进…

Flask中@app.route()的methods参数详解

诸神缄默不语-个人CSDN博文目录 在 Flask 中&#xff0c;app.route 是用于定义路由的核心装饰器&#xff0c;开发者可以通过它为应用指定 URL 映射及相应的处理函数。在处理 HTTP 请求时&#xff0c;不同的业务场景需要支持不同的 HTTP 方法&#xff0c;而 app.route 的 metho…