C++修炼之练气期第十层——auto | 范围for | nullptr

这篇具有很好参考价值的文章主要介绍了C++修炼之练气期第十层——auto | 范围for | nullptr。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++修炼之练气期第十层——auto | 范围for | nullptr
C++修炼之练气期第十层——auto | 范围for | nullptr

🌷专栏导读

🌸作者简介:花想云,在读本科生一枚,致力于 C/C++、Linux 学习。

🌸本文收录于 C++系列,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新!

🌸相关专栏推荐:C语言初阶系列C语言进阶系列数据结构与算法

本章为C++修炼之练气期最后一篇,为大家整理了C++11中一些新的语法,也是为接下来C++更深一层学习做个铺垫。本章我们将学习 auto 关键字、范围 for 的使用、nullptr 关键字,一起进入新的学习吧~

🌷auto 关键字

🌺什么是 auto

C++ 中引入了新的关键字 auto,其作用为自动推导类型
例如:

int main()
{
	int a = 0;
	auto b = a;
	auto c = &a;

	//打印变量的类型
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;

	return 0;
}

C++修炼之练气期第十层——auto | 范围for | nullptr

🌺 auto的使用细则

  • 使用 auto 定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此 auto 并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将 auto 替换为变量实际的类型
	//错误示例
	auto a;
  • 用 auto 声明指针类型时,用 auto 和 auto* 没有任何区别,但用 auto 声明引用类型时则必须加&
	int a = 0;
	auto b = a;
	auto c = &a;
	auto& d = a;
  • 在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
	auto a = 1, b = 2;
	auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同

🌺auto 不能推导的场景

  • auto 不能作为函数的参数
//错误示例
void Func(auto n)
{
	//...
}
  • auto 不能直接用来声明数组
	//错误示例
	auto arr[] = { 1,2,3 };
  • 为了避免与 C++98 中的 auto 发生混淆,C++11 只保留了 auto 作为类型指示符的用法;
  • auto 在实际中最常见的优势用法就是接下来会讲到的 C++11 提供的新式for循环,还有 lambda 表达式等进行配合使用;

🌷基于范围的 for 循环

C++98中如果要遍历一个数组,可以按照以下方式进行:

void TestFor()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
		array[i] *= 2;
	for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p)
		cout << *p << endl;
}

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环

🌺范围 for 的语法

for 循环后的括号由冒号分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。例如:

void TestFor()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (auto& e : array)
		e *= 2;
	for (auto e : array)
		cout << e << " ";
}

C++修炼之练气期第十层——auto | 范围for | nullptr

🌺范围 for 的使用条件

  • for 循环迭代的范围必须是确定的;
  • 迭代的对象要实现++==的操作;

对于数组而言,就是数组中第一个元素最后一个元素的范围;对于而言,应该提供beginend的方法,begin和end就是for循环迭代的范围。

//错误示例
void TestFor(int array[])
{
	for (auto& e : array)
		cout << e << endl;
}

🌷nullptr 关键字

在 C++98 中,我们一般这样初始化指针变量:

	int* p = NULL;

NULL实际是一个,在传统的 C头文件stddef.h 中,可以看到如下代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL  0
#else
#define NULL  ((void *)0)
#endif
#endif

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

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
int main()
{
	f(0);
	f(NULL);
	f((int*)NULL);
	return 0;
}

C++修炼之练气期第十层——auto | 范围for | nullptr
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0

为了避免出现类似的问题,C++11 中引进了新的关键字 nullptr ,为了提高代码的健壮性,在后续表示指针空值时建议最好使用 nullptr
C++修炼之练气期第十层——auto | 范围for | nullptr文章来源地址https://www.toymoban.com/news/detail-407767.html

到了这里,关于C++修炼之练气期第十层——auto | 范围for | nullptr的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 算法修炼之练气篇——练气八层

    博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的,练完这200多道题就考了今年第十四届的B组蓝桥杯C/C++获得了省一,后面还会

    2024年02月04日
    浏览(29)
  • 算法修炼之练气篇——练气五层

    博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的,练完这200多道题就考了今年第十四届的B组蓝桥杯C/C++获得了省一,后面还会

    2024年02月05日
    浏览(24)
  • 算法修炼之练气篇——练气十九层

    博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的,练完这200多道题就考了今年第十四届的B组蓝桥杯C/C++获得了省一,后面还会

    2024年02月05日
    浏览(64)
  • 算法修炼之练气篇——练气十五层

    博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的,练完这200多道题就考了今年第十四届的B组蓝桥杯C/C++获得了省一,后面还会

    2024年02月04日
    浏览(26)
  • 算法修炼之练气篇——练气十二层

    博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的,练完这200多道题就考了今年第十四届的B组蓝桥杯C/C++获得了省一,后面还会

    2024年02月05日
    浏览(64)
  • 算法修炼之练气篇——练气二十二层

    博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的,练完这200多道题就考了今年第十四届的B组蓝桥杯C/C++获得了省一,后面还会

    2024年02月04日
    浏览(30)
  • 【C++】---模板初阶(超详练气篇)

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 泛型编程,好家伙,名字倒是挺吓人,其实并没有

    2024年02月08日
    浏览(57)
  • 【C++修炼之路】C++入门(上)

    👑作者主页:@安 度 因 🏠学习社区:安度因的学习社区 📖专栏链接:C++修炼之路

    2024年01月17日
    浏览(36)
  • 【C++修炼之路】内存管理

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:C++修炼之路

    2024年02月16日
    浏览(25)
  • 【C++从练气到飞升】05---运算符重载

     🎈 个人主页 :库库的里昂 ✨ 收录专栏 :C++从练气到飞升 🎉 鸟欲高飞先振翅,人求上进先读书 。 目录 ⛳️推荐 一、运算符重载的引用 二、运算符重载 三、赋值运算符重载 1 .赋值运算符重载格式: 2 .赋值运算符只能重载成类的成员函数不能重载成全局函数: 3 .用户没有

    2024年04月14日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包