3.auto不能推导的类型
1、做函数参数
我们知道,函数在调用的时候,会开辟函数栈帧,开辟栈帧的时候,是需要知道参数的大小的,但是如果函数参数中存在auto,编译器不能确定函数调用的过程中传入的参数是什么类型,也就无法开辟栈帧。
2、直接声明数组
3、为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
4、auto在实际中最常见的优势用法就是跟C++11提供的新式for循环,还有lambda表达式等进行配合使用
基于范围的for循环
在C++98中,如果要遍历一个数组,我们可能会这样写
int main() { int array[] = { 1,2,3,4,5 }; for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i) { //对数组中元素进行操作 //... } }
但是,对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
int main() { int array[] = { 1,2,3,4,5 }; for (auto& e : array) { e *= 2; } for (auto e : array) { cout << e << " "; } cout << endl; }
如果这里要更改数组内的元素,就要用到引用。
空指针nullptr(C++11)
在C语言中,我们在定义指针变量的时候,为了防止也野指针的出现,往往会给指针变量赋值为NULL,本质上NULL是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
但是在C++的文件中,是这样的
我们发现NULL被宏定义成了一个整型,这样的话对于下面这串代码,我们的本意是调用第二个函数,但是编译器识别出我们传入的是整型,因此会调用第一个函数,与我们所期望的不一样。所以C++委员会为了处理这个问题,加入了一个关键字nullptr,用来表示空指针,所以以后在C++中,我们就不再使用NULL,而是nullptr。
void f(int) { cout<<"f(int)"<<endl; } void f(int*) { cout<<"f(int*)"<<endl; } int main() { f(NULL); return 0; }
而是nullptr。
void f(int) { cout<<"f(int)"<<endl; } void f(int*) { cout<<"f(int*)"<<endl; } int main() { f(NULL); return 0; }




