1、auto的概念
在C++11
中,auto
不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto
声明的变量必须由编译器在编译时期推导而得。
2、auto的使用
实列说明:
int main()
{
int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
return 0;
}
运行结果:
解析:
在编译阶段编译器根据初始化表达式来推导auto
的实际类型。因此auto
并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
注意:
1、在使用auto时必须对其进行初始化。
2、当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。 列如:
void TestAuto()
{
auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}
2、auto不能作为函数的参数。 列如:
void TestAuto(auto a) {} //错误
3、auto不能直接用来声明数组。 列如:
auto b[] = {4,5,6}; //错误
4、 auto不能定义类的非静态成员变量
5、实例化模板时不能使用auto作为模板参数
3、基于范围的for循环
实列说明:
#include<iostream>
using namespace std;
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
for (auto& e : array)
e *= 2;
for (auto e : array)
cout << e << " ";
return 0;
}
运作结果:
解析:
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,这个变量可以随意设置;第二部分则表示被迭代的范围,也就是要循环的目标。一般来说,auto
通常和这样的for
循环结合起来使用。
4、范围for的使用条件
1、for循环迭代的范围必须是确定的 。对于数组而言,就是数组中第一个元素和后一个元素的范围;对于类而言,应该提供begin和end的方法, begin和end就是for循环迭代的范围。列如下面的代码就是错误的:
void TestFor(int array[])
{
for(auto& e : array)
cout<< e <<endl;
}
这是因为数组array
作为函数参数时,会隐式的转化为指针。
2、只会执行++
和==
操作,也就是说只有执行遍历操作时(列如:遍历整个数组的元素时),才可使用它。