【C++笔记】引用、inline关键字和nullptr

news2024/10/23 9:24:50

前言

各位读者朋友们大家好,上期我们讲了C++的部分基础语法,这期我们继续对C++语法进行深入的学习。

目录

  • 前言
  • 一. 引用
    • 1. 引用的概念及定义
    • 2. 引用的特性
    • 3. 引用的使用
    • 4. const引用
    • 5. 指针和引用的关系
  • 二. inline
  • 三. nullptr

一. 引用

1. 引用的概念及定义

引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟新的内存空间,它和它引用的变量共用一块内存空间。就像现实生活中的外号或者网名一样。

  • 引用的形式
    类型& 引用别名 = 引用对象
int main()
{
	int a = 0;
	int& b = a;
	int& c = b;
	int& d = c;

	int m = 1;
	d = m;
	
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	cout << d << endl;
	cout << m << endl;
	return 0;
}

在这里插入图片描述
上面代码中,我们定义了一个变量a,又给它取名b,c,d(对其进行引用),因此b,c,d都是a这一变量,然后又定义了变量m,将其赋值给d,因为d是a,所以a,b,c,d都变成了1。

2. 引用的特性

  • 引用在定义时必须初始化
    在这里插入图片描述

  • 一个变量可以有多个引用
    在这里插入图片描述
    就像一个人的别称可以有很多个。

  • 引用一旦引用一个实体,就不能再引用别的实体(引用的对象不能被改变)
    在这里插入图片描述

3. 引用的使用

  • 引用在实践中的使用主要是用于引用传参和引用作返回值中减少拷贝提高效率和改变引用对象的同时改变被引用对象。
    在这里插入图片描述
    在C语言中,我们想通过函数交换两个数的值,只能通过传指针来改变,有了引用我们可以通过传引用来改变,就减少了传指针过程中的地址拷贝,提高了效率。
    在这里插入图片描述
    我们在Func这个函数中,对引用对象进行了自增操作,在主函数中,a的值也进行了自增,所以,我们可以在改变引用对象的同时改变被引用对象。
  • 引用作返回值的场景相对复杂,这里讲一下错误示范,后续深入的内容我们在类和对象部分深入讲解。
int& Func()
{
	int a = 0;
	return a;
}

这里我们返回了临时变量,当函数调用结束后,a的栈帧就被销毁,我们返回a的引用就类似于返回了一个野指针,因此不能将a的引用作为返回值。

  • 引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引用和其它语言的引用是有很大区别的,除了用法,最大的特点是C++的引用定义后就不能改变指向。

4. const引用

  • 可以引用一个const对象,但是必须用const引用。const引用一可以引用普通的对象,因为对象的访问权限在引用过程中可以缩小,不能放大。
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象,C++中把这个未命名对象叫做临时对象。

5. 指针和引用的关系

C++中指针和引用就像两个性格迥异的亲兄弟,指针是哥哥,引用是弟弟,在实践中他们相辅相成,功能有重叠性,但各有各的特点,互相不可替代。

在这里插入图片描述
转到汇编看,指针和引用的底层是相似的。

  • 语法概念上引用是一个变量的别名不开空间,指针是储存一个变量的地址,要开空间。
  • 引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
  • 引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以改变指向。
  • 引用可以直接访问指向对象,指针需要解引用才能访问指向对象。
  • sizeof中含义不同,引用结果为引用类型的大小,但指针始终是4/8个字节。
    在这里插入图片描述
  • 指针很容易出现野指针和空指针的问题,引用很少出现,引用使用起来相对安全。

二. inline

inline是C++的一个关键字,是一种向编译器发出的建议,用于指示编译器尝试将函数体直接插入到每个调用该函数的地方,而不是像通常那样进行函数调用。这样做的目的是减少函数调用的开销,特别是对于那些体积小且频繁调用的函数。

  • 用inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开(替换)内联函数,这样在调用内联函数时,就不用建立栈帧了,可以提高效率。相当于宏的作用。
inline int Add(int x, int y)
{
	int ret = x + y;
	return ret;
}
int main()
{
	int ret = Add(1, 2);
	return 0;
}

对于上面这段代码,我们转汇编看一下执行指令:
在这里插入图片描述
在汇编语言中,call 指令用于从当前代码位置跳转到另一个代码位置(通常是一个函数或过程)执行,并在执行完毕后返回到原来的位置继续执行。这个过程涉及到栈的使用,以确保在函数调用结束后能够正确地返回到调用点。也就是说,有call指令就是函数没有展开。 我们的Add函数是内联函数,为什么没有展开?

  • Debug模式下内联默认不展开,这样便于我们调试
    如果展开就会像宏一样将代码替换掉,宏是不支持调试的,不能F11进入函数,函数会直接执行完宏到下一条语句,所以为了支持调试,Debug模式下内联函数不会展开。
    想要在Debug模式下展开内联函数可以按下面的操作进行设置:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这样就展开了
  • inline对于编译器而言只是一个建议,也就是说,加了inline编译器也可以选择在调用的地方不展开,不同的编译器关于inline什么情况下展开各不相同,因为C++标准没有规定这个。inline适用于频繁调用的短小函数,对于递归函数,代码相对多一些的函数,加上inline也会被编译器忽略。
    • 递归函数本质上是通过函数调用自身来解决问题的。如果编译器尝试将递归函数内联,那么每次递归调用都会尝试内联,这可能导致代码爆炸式增长(即代码膨胀)。这种膨胀不仅会增加编译时间,还可能导致生成的二进制文件异常庞大,并且可能降低程序的性能,因为过多的代码重复和更大的缓存压力。
    • 对于代码量相对较大的函数,内联可能会导致代码膨胀的问题更加严重。内联函数的目的之一是减少函数调用的开销,但如果函数体本身很大,那么内联后的代码膨胀可能会抵消掉调用开销减少带来的性能提升。
      在这里插入图片描述
  • C语言实现宏函数也会在预处理的时候替换替换展开,但是宏函数的实现很容易出错,且不方便调试,C++设计了inline的目的就是替代C语言的宏函数。
    比如要写一个宏定义一个加法函数:
    在这里插入图片描述大家可能会写出很多错误的写法,但是有了inline之后就不容易出错了。
  • inline不建议声明和定义分离到两个文件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出错。
    在这里插入图片描述

三. nullptr

NULL实际上是一个宏,在C头文件(stddef.h)中,可以看如下代码:
在这里插入图片描述
看下面这段代码运行结果如何:

void Func(int a)
{
	cout << "Func(int a)" << endl;
}

void Func(int* ptr)
{
	cout << "Func(int* ptr)" << endl;
}

int main()
{
	Func(0);
	Func(NULL);
	return 0;
}

按照C语言的语法,应该是输出Func(int a)和Func(int* ptr),但是实际运行结果并不是这样的在这里插入图片描述
这是因为在C++中,NULL是被定义成字面常量0
在这里插入图片描述
因此在调用的时候就调用的第一个函数。
C++11中引入nullptr,nullptr是一个特殊的关键字,nullptr是一种特殊类型的字面常量,它可以转换成任意其它类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式的转换为指针类型,而不能被转换为整数类型。
所以我们以后再使用空指针时就定义为nullptr了

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

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

相关文章

ubuntu登录root用户相关配置与注意事项

在ubuntu系统中&#xff0c;部分文件的访问与操作需要在root权限的认证加持下才能顺利进行&#xff0c;以下对如何登录root权限用户进行记录。 学习目标&#xff1a;随心所欲地切换普通权限用户与root用户 首先&#xff1a;在Ubuntu系统中&#xff0c;出于安全考虑&#xff0c;…

项目验收 | 星云股份携手盘古信息加“数”前行,数字智慧提升生产效率

在位于福州市的现代化智能制造工厂内&#xff0c;一排排先进的储能变流器&#xff08;PCS&#xff09;和充电桩正在紧锣密鼓地生产中&#xff0c;从电池研发、工程应用的系列测试及自动化装备&#xff0c;再到应用于电动汽车、储能新基建的储能变流器及充电桩等&#xff0c;福建…

ajax php

文章目录 get请求postget和post的异同点ajax原生步骤jquery步骤优点 php安装&#xff0c;后台处理脚本语言。 后端开发语言不能直接允许&#xff0c;必须放在服务器对对应的文件夹下运行。 如&#xff1a;wamp的对应服务器的文件夹是www get请求 <!DOCTYPE html> &l…

手机摄影入门

感觉会摄影的人是能够从生活中发现美的人。 我不太会拍照&#xff0c;觉得拍好的照片比较浪费时间&#xff0c;而且缺乏审美也缺乏技巧&#xff0c;所以拍照的时候总是拍不好。但有时候还是需要拍一些好看的照片的。 心态和审美可能需要比较长时间提升&#xff0c;但一些基础…

Firefox火狐浏览器新建标签页的位置

文章目录 环境新建标签页的位置打开“与当前页面相关的”新标签页 环境 Windows 11家庭版Firefox浏览器 131.0.2 (64 位) 新建标签页的位置 比方说浏览器打开了两个标签页&#xff0c;当前浏览的是第一个标签页&#xff0c;如下图所示&#xff1a; 此时&#xff0c;如果新建…

国有特大型企业安全知识竞赛,赛制就是不一样

国家电力投资集团有限公司是中央直接管理的特大型国有重要骨干企业&#xff0c;肩负保障国家能源安全的重大责任&#xff0c;业务涵盖电力、热力、煤炭、铝业、物流、金融、环保、光伏、电站服务等领域, 拥有核电、火电、水电、风电、光伏发电等全部发电类型。 电投集团本次安…

星舰第五次发射解读:火箭「筷子」夹取技术的奥秘

SpaceX 的星舰&#xff08;Starship&#xff09;第五次发射成功&#xff0c;引发了全球航天领域的广泛关注。在这次发射中&#xff0c;最引人注目的是其一级助推器 Super Heavy 成功回收&#xff0c;并首次被发射塔上的「筷子」机械臂精准抓取。这标志着 SpaceX 朝着完全可重复…

dotjs学习使用

数据插入 {{ }} for interpolation //插入案例 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>do…

无人机之三维航迹规划篇

一、基本原理 飞行环境建模&#xff1a;在三维航迹规划中&#xff0c;首先需要对飞行环境进行建模。这包括对地形、障碍物、气象等因素进行准确的测量和分析&#xff0c;以获得可行的飞行路径。 飞行任务需求分析&#xff1a;根据无人机的任务需求&#xff0c;确定航迹规划的…

电力电子技术(四)

单相可控整流电路&#xff1a;&#xff08;包括单相半波整流和单相桥式整流&#xff09; &#xff08;一&#xff09;单相半波整流&#xff1a; 1.1阻性负载&#xff1a; 晶闸管导通条件&#xff1a;1.阳极承受正向电压 2.门极具有触发信号 这里的触发延迟角的定义要注意记…

Go语言中的函数:简单有趣的代码块魔法(五)

Go语言中的函数&#xff1a;简单有趣的代码块魔法 Go语言中的函数不仅简单易用&#xff0c;还带有一些有趣的小魔法&#xff0c;让它在代码世界里游刃有余。本文将带你通俗易懂地理解Go函数的声明与调用、多返回值、命名返回值、可变参数、匿名函数与闭包&#xff0c;以及函数作…

mac地址漂移实验

MAC地址漂移是指交换机的MAC地址表中的内容被改变&#xff0c;导致网络中的数据包无法正确传输到目标设备。在正常情况下&#xff0c;网络中的MAC地址应该是稳定的&#xff0c;不会频繁发生变化。因此&#xff0c;如果在短时间内出现大量MAC地址漂移的情况&#xff0c;可能意味…

【Web——HTML 初阶】网页设计标题

♥HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是构建网页和Web应用的基础语言之一。它不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;用于描述网页的结构和内容。HTML使用标签&#xff08;tags&#xff09;来标记不同类型的…

NFTScan | 10.07~10.13 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.10.07~ 2024.10.13 NFT Hot News ​01/ 数据&#xff1a;9 月份加密市场大多数指标均出现下降&#xff0c;链上总交易量下降 13% 10 月 7 日&#xff0c;据 The Block 研究总监 la…

阿里云ACP好考吗?阿里云ACP备考攻略及工具一站式备齐!

经常有小伙伴问&#xff1a;阿里云ACP好考吗&#xff1f;阿里云ACP难吗&#xff1f;作为过来人&#xff0c;给大家做好了阿里云ACP认证的整体规划&#xff0c;你只需要跟着做就okk啦&#xff01;再告诉大家一个好消息&#xff1a;目前阿里云ACP还是不用做实验的&#xff01; 一…

如何在算家云搭建Video-Infinity(视频生成)

一、模型介绍 Video-Infinity是一个先进的视频生成模型&#xff0c;使用多个 GPU 快速生成长视频&#xff0c;无需额外训练。它能够基于用户提供的文本或图片提示&#xff0c;创造出高质量、多样化的视频内容。 二、模型搭建流程 1.大模型 Video-Infinity 一键使用 基础环境…

深圳出手!新能源汽车被针对了

文 | AUTO芯球 作者 | 雷慢 这个政策好啊&#xff0c;我举双手赞成&#xff01; 来看&#xff0c;深圳刚发布了针对新能源车地下车库充电的管理规范&#xff0c; 我替你们扒了一遍&#xff0c;要点就几个&#xff0c; 新能源充电桩不能设在地下四层及以下&#xff0c; 这点…

产品图册转换为电子图册

​标传统的产品图册不仅体积庞大&#xff0c;携带不便&#xff0c;而且更新换代速度慢&#xff0c;信息更新不及时。在这个信息化时代&#xff0c;我们需要一种更加便捷、高效的方式来展示产品。那么&#xff0c;可翻页的电子画册怎么制作呢&#xff1f; 1.要制作电子杂志,首先…

“全民拼团:解锁社交电商新玩法,乐享购物与分红“

在当前电子商务领域&#xff0c;一种创新的购物体验——全民团购风潮正逐渐兴起。它创造性地将社交功能与电商购物相结合&#xff0c;借助团购、拼购等活动&#xff0c;不仅使消费者能够享受到更优惠的价格&#xff0c;更赋予购物过程一种全新的乐趣和互动性。 全民团购模式的独…

史诗级回归,连播两集,燃到让人窒息

《超人和露易丝》自2021年首播以来&#xff0c;虽然起初没有掀起太大的波澜&#xff0c;但凭借着温情的家庭故事与用心的制作&#xff0c;慢慢积累了口碑。它不再是简单的“英雄拯救世界”套路&#xff0c;而是把超人的身份放进了家庭的框架里&#xff0c;展现了英雄在拯救世界…