文章目录
前言
本文我了解一下C++11新特性的auto、范围for以及nullptr给我们的编程带来了什么样的好处,以及我们在特定的场景该如何使用它们。
温馨提示:本文所讲到的C++11(2011年)和C++98(1998年)均为C++编译器的版本。
OK,让我们一起探索这些auto、范围for以及nullptr背后的秘密。
1. auto关键字(C++11)
这里需要说明的一点是,在C++98就已经有auto这个关键字了。不过在C++98的做法中,它将auto关键字视作一个存储类型的指示符。换句话说,只要是在C++98中使用auto关键字定义的变量就是一个具有自动存储器功能的局部变量 – 待补充
1.1 为什么要有auto关键字
这就要往类型别名的方向去思考这个问题。
想一个现象,随着我们越学到后面,代码就会变得愈加复杂,伴随的是声明类型的长度也会增加,这个就会导致两个问题:
- 类型难以拼写;
- 类型含义不明确导致出错。
这么说可能有点干巴,下面我来展示一段代码(这个是大家以后学习C++要用到的):
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
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;
}
上面的std::map<std::string, std::string>
和 std::map<std::string, std::string>::iterator
,这两个类型够长吧,即使你能记得住,如果有很多地方都要定义的话,我估计你的键盘可能会敲冒烟。
那有的人就会这么想,那我可以用typedef
来给这些长的类型起一个别名,比如下面这样:
#include<iostream>
#include<string>
#include<map>
#include<vector>
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;
}
这个方法确实是可以的,但是你能确保在庞大的代码量面前,你能十分的明确Map这个类型所代表的具体含义吗?本人觉得这是一件很难的事,另外用typedef
关键字,还有个重要的细节:
#include<iostream>
using namespace std;
typedef int* int_ptr;
int main()
{
int num1 = 66,num2 = 88;
//写法1:
int_ptr a = &num1 , b = &num2;
//写法2:
int_ptr a = &num1 , *b = &num2;
//以上两种写法那个是正确的?
}
答案:写法一是正确的。
#include<iostream>
using namespace std;
int main()
{
int num1 = 66,num2 = 88;
//写法1:
int* a = &num1 , b = &num2;
//写法2:
int* a = &num1 , *b = &num2;
//以上两种写法那个是正确的?
}
答案:写法二是正确的。
如果你上面两道题目做对了一道的话,那我想auto关键字就很适合你使用了!
1.2 auto关键字的使用方式
标签:11,int,auto,nullptr,C++,关键字 From: https://blog.csdn.net/tianxiawushanu/article/details/143362108