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

 

目录

 

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.hqwc.cn/news/457624.html

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

相关文章

QCustomplot实现灰度曲线图

从 QCustomplot官网 https://www.qcustomplot.com/index.php/download 下载支持文件。首页有些demo可以进行参考学习。 新建一个Qt工程,将下载得到的qcustomplot.h和qcustomplot.cpp文件加入到当前工程。pro文件中加上 printsupport 在ui界面中,添加一…

THM学习笔记——枚举

复制以下内容时注意中英文符号区别 在枚举之前我们要将shell升级为完全交互式的tty。 这涉及以下几条命令 python -c import pty;pty.spawn("/bin/bash") stty raw -echo export TERMxterm rlwrap nc -lvnp 443 从以上选一条即可 手动枚举 以下命令只需了解即可&…

git 使用 (备查)

git忽略清单 添加忽略清单 SSH免登录 ssh协议可以实现免登录操作,身份验证通过密钥实现。 跨团队写作 解决冲突 拉取 克隆 拉取最新版本 推送 远程仓库别名 直接使用git push推送 多人协作开发 分支命令 合并分支命令在主分支使用,将develop分支合并到…

《向量数据库指南》——Milvus Cloud 「部署」:简化部署一直在路上

“docker-compose 能部署分布式吗?”"单机部署为什么还依赖这么多组件?"“大家 Milvus Cloud 集群部署有没有实践过比较好的方案?” 作为一个开源数据库,是否能够进行快速部署,是所有工作的前提。在简化部署的道路上,社区从来没有停止过脚步。2023 年,社区推…

使用 openpyxl 操作 Excel

由于单位有任务,需要按照名册制作多个工作表。手动复制和修改内容太费事了,所以使用python完成此项工作,为之后的此类工作提供一个通用脚本。 安装依赖库 pip install openpyxl lxml我们需要用到openpyxl。在官方文档中提到,如果…

【Git】07 本地仓库同步到GitHub或Gitee

文章目录 一、远端仓库配置1.1 配置密钥认证1.2 新建仓库 二、本地配置2.1 添加远程库 三、push推送四、拉取合并与推送4.1 拉取fetch4.2 合并merge4.3 推送push 五、总结 一、远端仓库配置 1.1 配置密钥认证 1)ssh-keygen 本地端命令行上执行ssh-keygen命令&…

2024-02-06(Sqoop)

1.Sqoop Apache Sqoop是Hadoop生态体系和RDBMS(关系型数据库)体系之间传递数据的一种工具。 Sqoop工作机制是将导入或者导出命令翻译成MapReduce程序来实现。在翻译出的MapReduce中主要是对inputformat和outputformat进行定制。 Hadoop生态包括&#…

Jmeter 基于Docker 实现分布式测试

基于Docker 实现分布式测试 制作Jmeter基础镜像制作工作节点镜像启动工作节点启动控制节点遇到的问题 使用Docker 部署Jmeter非常方便,可以省略软件的安装以及配置,比如jdk、jmeter。需要部署多个工作节点可以节省时间。 控制节点(Master-主节…

数据库触发器

在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分 别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时…

服务器被黑,安装Linux RootKit木马

前言 疫情还没有结束,放假只能猫家里继续分析和研究最新的攻击技术和样本了,正好前段时间群里有人说服务器被黑,然后扔了个样本在群里,今天咱就拿这个样本开刀,给大家研究一下这个样本究竟是个啥,顺便也给…

工业以太网交换机引领现代工厂自动化新潮流

随着科技的飞速发展,现代工厂正迎来一场前所未有的自动化变革,而工业以太网交换机的崭新角色正是这场变革的关键组成部分。本文将深入探讨工业以太网交换机与现代工厂自动化的紧密集成,探讨这一集成如何推动工业生产的智能化、效率提升以及未…

【教学类-47-01】UIBOT+IDM下载儿童古诗+修改文件名

背景需求: 去年12月,我去了其他幼儿园参观,这是一个传统文化德育教育特色的学校,在“古典集市”展示活动中,小班中班大班孩子共同现场念诵《元日》《静夜思》包含了演唱版本和儿歌念诵版本。 我马上也要当班主任了&a…