C++入门篇(3)auto关键字、内联函数、nullptr关键字

news2024/11/14 17:44:39

 

目录

 

1.auto关键字(C++11)

1.1  typedef取别名的缺陷

1.2 auto

1.3 auto使用细则

1.3.1 auto与指针引用结合使用

1.3.2 同一行定义多个变量

1.4 auto不能推导的场景

1.4.1 auto不能作为函数的形参

 1.4.2  auto不能直接用来声明数组

2. 内联函数

2.1 宏的缺陷

2.2  内联函数概念

 2.3 内联函数特性

3.nullptr关键字


1.auto关键字(C++11)

1.1  typedef取别名的缺陷

在敲代码时往往会遇到一个比较长的类型名,这时候通常会使用typedef对该类型进行重命名,但有一种情况typedef会有一定的缺陷

typedef char* pstring;
int main()
{
    const pstring p1;   
    const pstring* p2;  
    return 0;
}

在这段代码中,第一个定义是编译不过的,因为第一个类型声明展开后是

char* const p1

并不是

const char* p1

因此定义p1就必须初始化(const修饰p1,意味着p1是一个常量指针,必须初始化),否则编译报错。确实这种展开看起来很怪,但是语法如此。

1.2 auto

C++11中,auto可以自动识别类型

int main()
{
	const int a = 1;
	auto b = a;
	b = 2;
	auto& ra = a;
	return 0;
}

在面对很长的类型名时,这种特性就比较实用。

1.3 auto使用细则

1.3.1 auto与指针引用结合使用

auto可以自动识别指针类型变量

int main()
{
    int a = 0;
    auto pa1 = &a;
    auto* pa2 = &a;
    return 0;
}

pa1和pa2没有区别。

auto*意为必须为一个指针类型的变量。

auto识别引用则必须要加上&

int main()
{
    int a = 0;
    auto& ra = a;
    return 0;
}

1.3.2 同一行定义多个变量

这种情况下一行中的变量必须是同一个类型,否则会报错。

注意:auto使用时必须初始化,因为编译器需要根据初始化的数据类型确定出auto的实际类型。

1.4 auto不能推导的场景

1.4.1 auto不能作为函数的形参

void func(auto a)
{
    ;
}

此处编译器会报错,因为编译器无法推导出a的实际类型 。

 1.4.2  auto不能直接用来声明数组

void TestAuto()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6};
}

2. 内联函数

2.1 宏的缺陷

在C语言中,宏可以定义一些短小简单的功能,比如下面这个求两个数较大值的宏

#define Max(a, b) a > b ? a: b

但由于宏只是做简单的替换工作,导致宏比较不安全,并且非常容易写错,比如上面的那个宏就写的不好。 因为传给a的可能是表达式,表达式中可能有各种运算符,就可能打乱运算顺序,导致最终得不到像要的结果,要解决这个问题就得加上很多括号。

#define Max(a, b) ((a) > (b) ? (a): (b))

这样才算得上比较完善。

从这也能看出宏的缺点:

不能调试

没有安全的类型检查

过于复杂

2.2  内联函数概念

尽管宏有那些缺点,但是宏却有一个不折不扣的好处,由于是直接在编译阶段就展开了,省去了函数调用建立栈帧的过程,效率会更高。为了能够继承宏的好处,同时能够丢弃宏的缺点,C++提出了内敛函数。

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。

inline int Add(int x, int y)
{
	int c = x + y;
	return c;
}

编译期间函数会直接用函数体替换函数调用。

查看方式:

1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add

2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不
会对代码进行优化,以下给出vs2022的设置方式)

 

 2.3 内联函数特性

1.内联函数是一种用空间换时间的方式,因为内联函数直接展开,因此会增加代码量,在工程中如果有大量的内联函数展开,会极大的影响文件的大小,一个五十行的函数,如果被使用了一百次,就会多出五千行代码,因此只有在函数较短时才会使用内联。

2.inline对于编译器只是一个建议,也就是说编译器不一定会直接展开,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。

3.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到。

3.nullptr关键字

NULL实际上是一个宏,但是在C++的定义中,NULL出了一点问题

这是C++中对于NULL 的定义,不知道为什么NULL被直接定义成了0,导致在使用时会出现一些问题,因此C++11标准中打了一个补丁,就是nullptr。

nullptr并非是宏,而是一个关键字,NULL需要包含头文件才能使用,而nullptr不需要。

 

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

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

相关文章

net start mysql服务名无效|发生系统错误 解决办法

未输入正确的mysql服务名 解决办法: 使用net start命令查看可用的服务名,找到mysql的服务名 未使用管理员身份运行命令提示符 解决方法: 使用管理员身份运行命令提示符

【Yi-VL-34B】(5):使用3个3090显卡24G版本,运行Yi-VL-34B模型,支持命令行和web界面方式,理解图片的内容转换成文字

1,视频地址 https://www.bilibili.com/video/BV1BB421z7oA/ 2,关于Yi-VL-34B https://www.modelscope.cn/models/01ai/Yi-VL-34B/summary 易视觉语言(Yi-VL)模型是易大型语言模型(LLM)系列的开源多模态…

人工智能|深度学习——使用多层级注意力机制和keras实现问题分类

代码下载 使用多层级注意力机制和keras实现问题分类资源-CSDN文库 1 准备工作 1.1 什么是词向量? ”词向量”(词嵌入)是将一类将词的语义映射到向量空间中去的自然语言处理技术。即将一个词用特定的向量来表示,向量之间的距离(例…

【buuctf--九连环】

这题主要是记录一下新的隐写工具 steghide 用binwalk 看一下 jpg 图片,还是有不少东西,那么-e 提取一下实际上通过binwalk 提取就避免了伪加密的问题,详见BUUCTF-九连环_九连环 buuctf-CSDN博客 其中 qwe.zip为真加密,需要找出密码&#xff…

计算机设计大赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…

龙芯安装Nodejs

由于龙芯3A5000/6000使用的是LoongArch指令集,然而Nodejs只支持X64和ARM指令集,无法使用常规的安装方法,虽然官方提供了源码,能在电脑上自行编译执行,但本人尝试后显示编译失败,在网络上查找解决方法得知还…

RBAC权限控制实现方案

上一文章讲述了利用RBAC实现访问控制的思路(RBAC实现思路),本文主要详细讲解利用vuex实现RBAC权限控制。 一、准备工作 从后台获取到权限对照表,如下: 1、添加/编辑楼宇 park:building:add_edit 2、楼宇管理 pa…

MySQL数据引擎、建库及账号管理

目录 一、MySQL数据库引擎 1.1.MySQL常见数据库引擎 1.InnoDB(MySQL默认引擎) 2.MyISAM 3.MEMORY(Heap) 1.2.存储引擎查看 二、建库 1.默认数据库介绍 2.建库 3.查看数据库 4.删除数据库 三、账号管理 1.创建用户 1.创建用户并设置登陆密码…

【电路笔记】-互感

互感 文章目录 互感1、概述2、互感3、耦合系数4、互感示例15、互感示例2 互感是一个线圈磁场与另一个线圈的相互作用,因为它在相邻线圈中感应出电压。 1、概述 互感是两个磁耦合线圈之间的电路参数,定义了一个线圈产生的时变磁通量被感应到相邻的第二个…

python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树:理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树:翻转…

Cpp-2

类与对象 /*类与对象:1.类是一种用户自定义的数据类型(函数,数据)2.类是具有相同的属性和行为的对象的集合3.类是对象的抽象,对象是类的具体4.对象:通过使用类类型定义的变量 */定义类 /*如何定义类&…

LabVIEW汽车自燃监测预警系统

LabVIEW汽车自燃监测预警系统 随着汽车行业的飞速发展,汽车安全问题日益受到公众的关注。其中,汽车自燃现象因其突发性和破坏性,成为一个不可忽视的安全隐患。为了有效预防和减少自燃事故的发生,提出了LabVIEW的汽车自燃监测预警…

ES节点故障的容错方案

ES节点故障的容错方案 1. es启动加载逻辑1.1 segment和translg组成和分析1.2 es节点启动流程1.3 es集群的初始化和启动过程 2. master高可用2.1 选主逻辑2.1.1 过滤选主的节点列表2.1.2 Bully算法2.1.2 类Raft协议2.1.3 元数据合并 2.2 HA切换 3. 分片高可用3.1 集群分片汇报3.…

前端常用代码整理(不断更新中)— js,jquery篇

1.随机函数代码 function getRandom(min, max) {return Math.floor(Math.random() * (max - min 1)) min}2.倒计时代码 let now new Date()// 2. 得到指定时间的时间戳let last new Date(这里写想要达到的时间)// 3. (计算剩余的毫秒数) / 1000 剩余…

ChinaXiv:中科院科技论文预发布平台

文章目录 Main彩蛋 Main 主页:https://chinaxiv.org/home.htm 彩蛋

11.0 Zookeeper watcher 事件机制原理剖析

zookeeper 的 watcher 机制,可以分为四个过程: 客户端注册 watcher。服务端处理 watcher。服务端触发 watcher 事件。客户端回调 watcher。 其中客户端注册 watcher 有三种方式,调用客户端 API 可以分别通过 getData、exists、getChildren …

vue3 使用defineAsyncComponent 动态加载组件

问题场景 在项目中使用静态加载组件基本能覆盖80%的场景了,如下图 但是我们在需要 循环生成一些的component 的时候或者在 开发ssr服务端渲染的页面 就会遇到有些组件以静态方式导入就会报错,导致进程失败,那么这时候就需要用到动态组件。那…

智能运维适合哪些行业?智能运维需要哪些设备?

构建一个智能运维系统所必须的设备和工具包括: 硬件设备: 服务器:用于部署智能运维平台和存储数据。 网络设备:包括路由器、交换机等,用于连接各种设备和系统。 存储设备:如硬盘、SSD等&am…

时序预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型 LSTM(长短期记忆)是一种递归神经网络(RNN)的变体,它在序列数据建模方面表现出色。电力负荷预测是一项重要的任务,可以利用LSTM神经网络…

Adb显示第3方应用的包名原理

Android早期版本实现原理请看 Android源码分析-pm命令的实现,列出包名pm list package,列出系统库pm list libraries_pm list packages-CSDN博客 Android12 对adb shell pm 实现原理做了重构:改成了template模式PackageManagerShellCommand …