C++拾遗(四)引用与指针

引用和指针是两种不同的概念,尽管它们在某些方面有一些相似之处,但它们在功能和用途上是有所区别

声明与定义

引用:引用是别名,是对已存在变量的另一个称呼,一旦一个变量被引用,就不能再被引用其他变

量。

int a = 10;

int& ref = a; 

这里,ref 是 a 的引用,它们引用的是同一个对象。

指针:指针是一个变量,其值为另一个变量的地址。指针可以被重新赋值以指向其他变量。

int a = 10;

int* ptr = &a; 

这里,ptr 是一个指向 a 的指针。

初始化和绑定

引用:引用必须在声明时就初始化,并且一旦一个引用被绑定到一个对象,就不能再被重新绑定到其他对象。

指针:指针可以在任何时候被初始化,也可以被重新指向其他对象。

int a = 10;

int* ptr = &a; 

int b = 20;

ptr = &b; 

这里,指针 ptr 被重新指向了 b

间接性

引用:引用不具有间接性,一旦一个变量被引用,就可以像使用该变量一样直接使用这个引用。

int a = 10;

int& ref = a;

std::cout << ref << std::endl;  

这里可以直接使用 ref,不需要间接性。

指针:指针具有间接性,必须通过解引用来使用指针所指向的对象。

int a = 10;

int* ptr = &a;

std::cout << *ptr << std::endl; 

这里需要使用 *ptr 来获取指针所指向的值。

操作

引用:引用本身不进行任何操作,对引用的操作实际上是对所引用的对象的操作。

int a = 10;

int& ref = a;

ref = 20; 

这里对引用的操作实际上是对所引用的对象的操作,此时a为20

指针:指针可以进行各种操作,如指针算术、比较等。

int a = 10;

int* ptr = &a;

*ptr = 20; 

这里对指针的操作会影响指针所指向的值,此时a为20

空值

引用:引用不能为空。

指针:指针可以为空。

int* ptr = nullptr;

动态内存分配

引用:不能用于动态内存分配。

指针:可以用于动态内存分配,如new

int* ptr = new int(20);

使用场景

引用:在函数参数传递、函数返回值等场景中经常使用引用,以提高效率并避免不必要的拷贝。

指针:在动态内存分配、实现复杂的数据结构(如链表、树等)时经常使用指针。

安全性

引用:使用引用更安全,因为它们不能被重新指向其他对象,也不能为空。

指针:指针可以指向无效的内存地址或未初始化的内存,因此使用指针需要更多的注意和小心。

取地址操作

引用:不能取一个引用的地址。

指针:可以取一个变量的地址,得到一个指向该变量的指针。

别名问题

引用:如果一个引用和它所引用的变量在程序的其他地方被改变,那么这个引用将会反映这些改

变。也就是说,引用是它所引用的变量的别名。

指针:一个指针可以被改变以指向另一个变量,但并不会影响原始变量的地址。也就是说,指针并

不一定是它所指向变量的别名。

引用使用场景

1.当需要将一个对象的引用分配给另一个变量时,应使用引用。

2.在函数参数中,期望的是按引用传递并修改原始数据,应使用引用。

3.在初始化列表中(如构造函数初始化列表),应该使用引用来初始化其他引用类型的变量。

指针使用场景

1.当从函数返回一个大的数据结构时,通常使用指针或智能指针。因为返回一个大的数据结构按值

传递会非常低效。

2.指针可以在任何时候指向任何对象。

3.指针可以指向一个空值。

4.对于动态分配的内存,应使用智能指针(如 std::unique_ptr 或 std::shared_ptr)而不是原始指针。

5.当重载操作符(如 operator->)时,通常会使用指针而不是引用,因为这些操作符期望的是一个指针类型的参数。

6.当模板参数是类类型时,因为类类型可能没有默认构造函数,而引用必须能够被初始化为一个有

效的对象。在这种情况下,使用指针作为模板参数可以避免编译错误。

7.将一个基类的指针转换为派生类的指针。这通常是通过多态来实现的。在这种情况下,应该使用

指向基类的指针,并在需要时进行类型转换。

8.在回调函数和函数指针的上下文中,通常使用原始指针而不是引用,因为回调函数通常以按值传

递的方式工作。此外,函数指针本身就是一个指向函数的指针,而不是对象的引用。

9.当需要传递大型数据结构或对象时,通过指针传递通常比按值传递更高效。

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

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

相关文章

java分布式锁详解

本地锁 浏览器把100w请求由网关随机往下传&#xff0c;在集群情况下&#xff0c;每台服务都放行10w请求过来&#xff0c;这时候每台服务都用的是本地锁是跨JVM的&#xff0c; 列如这些服务都没有49企业&#xff0c;此时有几个服务进行回原了打击在DB上面&#xff0c;那后期把这…

Allegro PCB如何关联原理图?

在用Allegro进行PCB设计时,我们可以点击Orcad原理图上的器件,然后PCB会自动跳转到该器件。那如何操作PCB上的器件点击跳转到原理图呢? 这种方式可以提高设计的效率。具体操作如下。 选择菜单栏Display

【软考问题】-- 2 - 知识精讲 - 项目立项管理

一、基本问题 1&#xff1a;项目投资前时期的四个阶段是什么&#xff1f; a.项目建议与立项申请 (1)定义&#xff1a;项目建设单位向上级主管部门提交项目申请时所必须的文件。(2)特点&#xff1a;项目发展周期的初始阶段、可行性研究的依据。(3)注意&#xff1a;又称项目建议书…

xinput1_3.dll文件的几种修复办法以及修复xinput1_3.dll注意事项

xinput1_3.dll文件是DirectX的一部分&#xff0c;它在Windows系统中负责处理游戏控制器的输入。然而&#xff0c;有时候此文件可能会出现问题&#xff0c;导致游戏无法正常运行或启动。在本文中&#xff0c;将介绍多种解决xinput1_3.dll文件问题的方法&#xff0c;并对它们进行…

【Web前端开发基础】CSS3之空间转换和动画

CSS3之空间转换和动画 目录 CSS3之空间转换和动画一、空间转换1.1 概述1.2 3D转换常用的属性1.3 3D转换&#xff1a;translate3d&#xff08;位移&#xff09;1.4 3D转换&#xff1a;perspective&#xff08;视角&#xff09;1.5 3D转换&#xff1a;rotate3d&#xff08;旋转&a…

vit细粒度图像分类(一)CADF学习笔记

1.摘要&#xff1a; 目的 基于Transformer架构的网络在图像分类中表现出优异的性能。然而&#xff0c;注意力机制往往只关注图像中的显著性特征&#xff0c;而忽略了其他区域的次级显著信息&#xff0c;基于自注意力机制的Transformer也是如此。为了获取更多的有效信息&#…

Spring基于AbstractRoutingDataSource实现MySQL多数据源

目录 多数据源实现 yml配置文件 配置类 业务代码 案例演示 多数据源实现 yml配置文件 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezoneUTC&useUnicodetrue&characte…

畅享阅读乐趣,探索精彩世界——推荐电子书网站

畅游书海&#xff0c;无限阅读——推荐优秀电子书网站https://nmbtngeg9486.github.io/ebook/ 在数字时代&#xff0c;电子书阅读已然成为一种时尚&#xff0c;而https://nmbtngeg9486.github.io/ebook/则是一座无限书海&#xff0c;为广大读者提供了丰富多彩的阅读选择。在这里…

企业转型:虚拟化对云计算的影响

虚拟化被认为是IT行业最优秀的技术之一。虚拟化提供的灵活性和效率&#xff0c;有助于企业根据不断变化的需求扩展其IT基础设施。虚拟化是云基础设施的基础&#xff0c;允许按需动态分配和管理计算资源。这种适应性对于满足现代企业的多样化需求至关重要&#xff0c;因为现代企…

外汇天眼:美国证券交易委员会(SEC)采纳了一系列规定,以加强与特殊目的收购公司(SPACs)相关的投资者保护

美国证券交易委员会&#xff08;SEC&#xff09;今天通过了一系列新规和修订&#xff0c;以增强特殊目的收购公司&#xff08;SPACs&#xff09;的首次公开募股&#xff08;IPOs&#xff09;中的披露&#xff0c;并在SPACs与目标公司之间的后续业务合并交易&#xff08;de-SPAC…

u盘可以分区吗?怎么分区?分区后不显示出来怎么办

随着科技的不断发展&#xff0c;U盘已经成为人们传输和存储数据的重要设备之一。而针对U盘的分区问题&#xff0c;很多人对此还不太了解。比如&#xff0c;U盘可以分区吗&#xff1f;U盘怎么分区&#xff1f;U盘分区后不显示出来怎么办&#xff1f;下面我们一起来针对这些问题进…

SpringCloud Aliba-Seata【下】-从入门到学废【8】

目录 1.数据库创建 1.seata_account库下建表 2.seata_order库下建表 3.seata_storage库下建表 4.在每个库下创建回滚日志 2.创建订单模块 2.1建工程 2.2加pom 2.3改yml 2.4file.conf 2.5registry.conf 2.6domain 2.7Dao 2.8Service 2.9controller 2.10confi…

对 MODNet 网络结构直接剪枝的探索

文章目录 1 写在前面2 遇到问题3 解决方案4 探索过程4.1 方案一4.2 方案二4.3 方案三 5 疑惑与思考5.1 Q15.2 Q2 1 写在前面 在前面的文章中&#xff0c;笔者与小伙伴们分享了对 MODNet 主干网络部分以及其余分支分别剪枝的探索历程&#xff0c;即先分解、再处理、后融合的手法…

c#模板设计模式

在 C# 中&#xff0c;模板设计模式是一种行为型设计模式&#xff0c;它允许定义一个算法的框架&#xff0c;并允许子类为一个或多个步骤提供实现。模板设计模式通过定义一个算法的骨架&#xff0c;而将一些步骤的实现延迟到子类中&#xff0c;以实现代码复用和提高扩展性。 以…

算法训练营Day38(动态规划1)

动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 区别 动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&…

C++:缺省参数函数重载

目录 C/C语言 函数调用的工作原理&#xff1a; 函数调用一般分为两个部分&#xff1a; 缺省参数&#xff1a; 缺省参数的分类&#xff1a; 全缺省参数 半缺省参数 注意事项&#xff1a; 缺省参数与C语言的调用参数对比&#xff1a; 函数重载&#xff1a; 函数重载…

pve8.1 安装、创建centos7虚拟机及配置

之前创建虚拟机centos7时&#xff0c;硬盘分配太大了&#xff0c;做成模板后无法进行修改了&#xff0c;安装完pve8.1后&#xff0c;强迫症犯了重新创建一下顺便记录一下配置过程。由于目前centos7还是生产用的比较多的版本所以本次还是安装centos7.9版本。 一、下载镜像 下载…

利用Redis List实现数据库分页快速查询的有效方法

目录 引言 传统数据库分页查询的挑战 Redis List的优势 利用Redis List实现分页查询 1. 数据准备 2. 分页查询 3. 分页缓存 4. 分页处理 结论 引言 随着Web应用程序的发展和用户数量的增加&#xff0c;数据库分页查询变得越来越常见。分页查询允许用户在大型数据集中…

JVM/GC复习

JVM/GC JVM(java虚拟机)MATjstack(将正在运行的JVM的线程进行快照并且打印出来)死锁VisualVM工具(监控线程内存使用情况)JMX GC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器…

JavaWeb,过滤器Filter和监听器Listener的学习

过滤器概述 Filter&#xff0c;即过滤器&#xff0c;是JAVAEE技术规范之一&#xff0c;作用于目标资源的请求进行过滤的一套技术规范 Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和…