auto关键字:类型占位符
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
使用场景:
- 用auto声明指针类型时,用auto和auto*没有任何区别
- 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
- auto不能作为函数的参数
- auto不能直接用来声明数组
- auto不能定义类的非静态成员变量
- 实例化模板时不能使用auto作为模板参数
- 最常见的优势用法就是基于范围的for循环
基于范围的for循环:for(e:要便利的范围)
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围
void test()
{
int arr[5]={0};
for(int e:arr) //int 根据范围元素类型确定,可以用auto
//for(int& e:arr)
{
e=1;
}
}
使用前提:
- for迭代的范围是确定的
- 自定义类型要实现迭代器功能
空指针nullptr:关键字
NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量
为消除这种二义性,所以C++11中引入了nullptr
使用:
- 在使用nullptr表示指针空值时,不需要包含头文件
- sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同