【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

这篇具有很好参考价值的文章主要介绍了【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


前言

本章是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。

一、auto关键字

1.1 问题引入

随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
1. 类型难于拼写(过长)
2. 含义不明确导致容易出错

来看看以下代码:

#include <iostream>
#include <string>
#include <map>
using namespace srd;

int main()
{
	std::map<std::string, std::string> m{ { "apple", "苹果" }, 
										  {"orange","橙子" },
										   {"pear","梨"} };
	std::map<std::string, std::string>::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

以上代码刚刚对于C++初学者可能看不懂,而std::map<std::string, std::string>::iterator 是一个类型还是看的出来的吧,但由于该类型太长了,写的也累。所以有些人可能想:可以通过typedef给这么长的类型取别名

例如:

#include <iostream>
#include <string>
#include <map>
using namespace std;

//重命名长类型
typedef std::map<std::string, std::string> Map;

int main()
{
	Map m{ { "apple", "苹果" },{ "orange", "橙子" }, {"pear","梨"} };
	Map::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

使用typedef给类型取别名确实可以简化代码,可能会引起以下问题:

  1. 难以理解:typedef可以创建新的类型名称,但可能会使代码难以理解和维护。如果类型名称太过简略或不符合命名规范,会导致代码的可读性降低。
  2. 可能会与其他定义冲突:由于typedef允许用户创建新的类型名称,因此可能会与其他定义发生冲突。这可以通过遵循命名规则和避免使用与其他名称相同的名称来避免。
  3. 难以进行调试:由于typedef创建了新的类型名称,因此调试时可能会难以确定变量的类型。这可以通过良好的代码注释和为类型名称选择有意义的名称来避免。
  4. 可能会导致错误:typedef也可以用于创建指向其他类型的指针或引用类型。如果不小心使用了错误的类型名称,可能会导致程序错误。这可以通过在代码中进行仔细的检查和测试来避免。

因此,C++11给auto赋予了新的含义。

1.2 auto简介

在早期auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是它使用的一点也不频繁。因此,C++11中标准委员会赋予了auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器它可以通过赋值操作符右边的表达式来推导出其类型。

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

typeid可以打印变量类型

1.3 auto的使用细则

1. auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

但用auto声明引用类型时则必须加&

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

2. 在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

96行代码会编译失败,因为c和d的初始化表达式类型不同。

1.4 常见auto不能推导的场景

1. auto不能作为函数的参数

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导

2. auto不能直接用来声明数组

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

1.5 基于范围的for循环(重点)

1.5.1 遍历数组

  • 普通方法遍历数组

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

对于普通的遍历,我们需要先求出数组大小。而对于auto遍历,却缺少了这一步,让我们继续往下看

  • auto遍历数组

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。它本质的意思是:依次取数组arr中的元素赋值给e

1.5.2 用auto修改数组元素

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

对于auto修改数组元素,要运用到引用,相当于对arr取别名

1.6 范围for的使用条件

1. for循环迭代的范围必须是确定的
2. 迭代的对象要实现++和==的操作

二、 指针空值nullptr

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

#include <iostream>
#include <stddef.h>

using namespace std;

int main()
{
	int* p = NULL;
	int* pp = 0;

	return 0;
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,我们通过查询cplusplus网站来查看其属性

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)文章来源地址https://www.toymoban.com/news/detail-440645.html

  • 程序本意是想通过NULL调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
  • 这是因为在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)NULL
    【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)
    C++11引入了nullptr,因此可以不用强转NULL
    【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)
    但需要注意的是:
  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

到了这里,关于【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

    目录 前言 函数重载 概念 重载函数的条件 C++支持重载函数的原理--名字修饰 引用 概念 特性 常引用(const引用) 使用场景 传值,传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto(C++11) auto简介 auto的使用规则 指针空值nullptr(C++11) C++98中的指针空值 结语

    2024年04月15日
    浏览(37)
  • 【C++初阶】C++基础(下)——引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr

      目录 1. 引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.5 传值、传引用效率比较 1.6 引用和指针的区别 2. 内联函数 2.1 概念 2.2 特性 3.auto(C++11) 3.1 类型别名思考 3.2 auto简介 3.3 auto的使用细则 3.4 auto不能推导的场景 4. 基于范围的for循环(C++11) 4.1 

    2024年02月15日
    浏览(61)
  • 【C++】C++入门 auto关键字详解(C++11)

    前言 C语言中包括了auto,它可用于定义局部变量。但自从所有的非全局变量的缺省值假定为auto以来,auto就几乎很少使用了。 在C或者以前C++中,auto基本上可以被无视. 但是在C++11中auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器, a

    2024年02月08日
    浏览(33)
  • 从C语言到C++(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for +nullptr

    目录 1. 内联函数 1.1 内联函数的概念 1.2 内联函数的特性 1.3 宏的优缺点和替代方法 2. auto(C++11) 2.1 改版前的auto 2.2 C++11的auto 2.3 auto 的使用场景 2.4 使用auto的注意事项 3. 范围 for(C++11) 3.1 范围 for 的用法 3.2 范围 for 的使用条件 4. 指针空值 nullptr 4.1 C++ 98 中的指针空

    2023年04月21日
    浏览(34)
  • 【C++深入浅出】初识C++下篇(auto关键字、范围for、nullptr指针)

    目录 一. 前言 二. auto 2.1 auto的引入 2.2 auto简介 2.3 auto的使用细则 2.4 auto不能推导的场景 三. 基于范围的for循环(C++11) 3.1 范围for的语法 3.2 范围for的原理 3.3 范围for的使用条件 四. 指针空值nullptr(C++11)         上期我们介绍了c++新增的两个重要语法:引用和内联函数,今

    2024年02月11日
    浏览(42)
  • C++ 入门篇(八) auto关键字

    目录 一、auto简介 二、auto的使用场景 三、注意事项 拓、范围for  【总结】 【源代码】  1.是什么?         auto是一个提示符,提示编译器根据变量的值来推导变量的类型。         在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,C++11中,

    2024年02月08日
    浏览(36)
  • 【C++入门】引用、内联函数、auto 关键字

    从语法上理解,引用就是给变量取一个 别名 ,它没有独立空间,和它引用的变量共用一块空间。 例子: 值得注意的是,C++ 中的引用一经初始化,后面是改变不了指向的(这点与Java有所不同),而且引用是必须初始化的。 引用的类型也必须和原变量对应,显然,你肯定不能

    2024年02月16日
    浏览(37)
  • 【C++】语法小课堂 --- auto关键字 & typeid查看实际类型 & 范围for循环 & 空指针nullptr

    🚩 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么? C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器, auto定义的

    2024年02月13日
    浏览(35)
  • 【C++入门必备知识:|引用| +|auto关键字| + |范围for|】

    在这里插入图片描述 引用不是新定义一个变量,而是给已经存在的变量取别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存区间。 比如水浒传里的李逵 小名叫铁牛,江湖人称黑旋风。这些都是他,只不过名字不同。 类型 引用变量名=引用实体

    2023年04月22日
    浏览(41)
  • 【C++基础】auto关键字(C++11)(auto的使用细则;auto不能推导的场景;auto的使用场景;基于范围的for循环)

    在早期C/C++( C++98 )中auto的含义是:使用auto修饰的变量,是具有 自动存储器的局部变量 ,但遗憾的是一直没有人去使用它。因为在函数内定义的变量默认就是局部变量。 C++11 中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的 类型指示

    2023年04月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包