一,auto关键字
开门介绍:
在C++准有规定中,auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量是由编译器在编译时期推导而得。具体简单运用如下:
#include <iostream> using namespace std; int main() { int a = 0; int b = a; auto c = a; auto d = &a; auto* e = &a; //typeid是输出指定数据的类型 cout << typeid(c).name() << endl; cout << typeid(d).name() << endl; cout << typeid(e).name() << endl; return 0; }
运行图:
可看出,auto可用来存储任意类型,像上面说的,它是一种类型提示符,提示系统声明的变量属于什么类型。
1-1,auto的使用
auto的使用其实不是向上面一样,auto在C++中真正的用武之地在于后面学习的复杂结构中,如C++中迭代器的使用,容器的运用等,比如vector::iterator it = v.begin();结构很复杂,使用auto可直接优化为auto it = v.begin()。(这里只是演示,我们只需明白auto的用法即可,具体深入使用后面的文章会具体讲解)。
auto的使用有着以下注意要素:
1,auto的使用必须初始化。auto是用来简化类型的,系统在编译阶段需要根据auto表达式来推导出auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
2,当用auto声明指针类型时,auto和auto*没有任何区别,但用auto声明引用类型时则必须 加&。因为引用的本质就是指定数据的"别名",类型与之相同,如果不加&,系统将不知是否使用引用引用型,而指针类型是"独特的",系统可以区分。
3,auto可以在同一行定义多个变量,但是这些变量必须是相同的类型,否则编译器将会报错,因为编译器在编译阶段只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
4,auto不支持函数的形参使用和函数的返回值使用,原因是当系统遍历到此函数的形参auto型时,相当于没有初始化一样,而一旦做返回值使用,将会出现很多麻烦。(这里与C++内部的复杂构造有关,在这里就不做过多说明)。
1-2,基于范围auto的for循环
在C++11标准介绍中,考虑到了for循环使用的麻烦,所以C++11中就引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,具体的细节和解说请看以下代码。初学者可能有些听不懂迭代的感念,不过本文这里不做重点,这里我们只需明白下面代码如何用auto使用即可,具体的知识后文会讲解,这里只是为后面打基础。
void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; //依次取数组中的所有数据赋值给别名e //自动判断结束,自动++往后面走 //由于引用的使用,下面的for循环相当与将数组中所有元素的乘2 for (auto& e : array) e *= 2; //依次输出数据2 4 6 8 10 for (auto e : array) cout << e << " "; }
二,nullptr的运用
nullptr相当于C语言中的NULL,C++专门制定此关键字也是为了弥补C中NULL的不足。C语言中的NULL其实是一个宏,直接将其定义为0,但这样以来都会产生一些不避免的麻烦,因为在C++98标准规定中,0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0,而nullptr的使用完美的解决了这一问题,所以,在后序的置空运用中,我们需改用nullptr。
C++初阶2--2https://developer.aliyun.com/article/1424514?spm=a2c6h.13148508.setting.22.214f4f0eDzCQ1n