关于auto关键字的简介
在早期的C / C++中的auto含义是使用auto修饰的变量,是具有自动存储器的局部变量。
在C++11中,赋予了auto全新的含义,也就是auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
来看一段代码
#include <iostream>
#include <typeinfo>
using namespace std;
int TestAuto()
{
return 10;
}
int main()
{
int a = 10;
auto b = a;
auto c = 'c';
auto d = TestAuto();
cout << typeid(b).name() << endl; //typeid可以查看变量类型,对应头文件 <typeinfo>
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
system("pause");
return 0;
}
接下来我们再修改一下,再加入一行变量声明:
auto e;
这样是无法通过编译的,因此使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。也就是说auto并不是一种类型声明,而是一个类型声明时的“占位符”,编译器在编译的时候会将auto替换为变量的实际类型。
关于auto的一些使用
- auto 与 指针和引用结合起来使用
先看例子
#include <iostream>
#include <typeinfo>
using namespace std;
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;
system("pause");
return 0;
}
使用auto声明指针类型时,用auto和auto*没有任何区别,但是使用auto声明引用类型时则必须加&
- 在同一行定义多个变量
比如
auto a = 1, b = 2;
要注意下面这样是不可以的
auto c = 3, d = 4.0;
因为c和d的初始化表达类型不同
下面列举一些不可以使用auto的情况:
-
auto不可以作为函数的参数
例如:void TestAuto(auto a) { }
这样写的话代码编译就会报错,因为auto不可以作为形参类型,编译器无法对a的实际类型进行推导
-
不可以用auto直接声明数组
例如:void TestAuto(auto a) { int a[] = { 1, 2, 3 }; auto b[] = { 4, 5, 6 }; }
对auto的总结:
auto是一个类型修饰符,他会根据你给变量初始化的值的类型来决定自己是什么类型
auto定义的变量必须初始化,否则不知道auto是什么类型
auto可以连续定义变量,类型由第一个定义的变量决定,后续不能违背这个类型,但是可以定义对应类型的指针和引用
auto不能做函数的参数类型
auto不能参与数组的类型
C++11后,auto会失去原本的含义
基于范围的for循环(C++11)
首先是范围for的语法
之前我们想要遍历一个数组,可以按照下面的方式
#include <iostream>
using namespace std;
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
int n = sizeof(array) / sizeof(array[0]);
for (int i = 0; i < n; ++i)
{
cout << array[i] << ' ';
}
cout << endl;
system("pause");
return 0;
}
或者
for (int * p = array; p < array + n; ++p)
{
cout << *p << ' ';
}
cout << endl;
对于一个有范围的集合而言,说明循环的范围很多时候显得有些多余,并且还有可能出现错误,所以在C++11中引入了基于范围的for循环
范围for的语法:
for循环后的括号由冒号":"分为两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
也就是说,在我们引入了范围for之后,可以写为下面这样
for (auto & i : array)
{
cout << i << ' ';
}
cout << endl;
当然也可以改变数组中的值
for (auto & i : array)
{
i *= 2;
}
这都是可以的。
for循环的迭代范围必须是确定的:
例如下面这样的使用方法,for循环的范围就不确定。
void TestAuto(int array[])
{
for (auto & i : array)
{
cout << i << endl;
}
}