在C语言中的auto关键字似乎用处不大,它是用来修饰局部变量的(通常可以省略)。但在C++中,auto完全与之不同,接下来就来学习一下吧。
目录
前言
随着程序越来越复杂,程序中的有些类型也越来越复杂,不易拼写,容易写错。这时候,我们可以用之前提过的typedef,但是typedef也有一些不可忽视的问题。
如:
1、在使用typedef定义别名时,别名应该清晰地显示变量的具体类型。
2、在使用 typedef 定义别名时,避免给它取与标准库或操作系统有关的名称,以避免名称冲突。
但是,auto可以很好地解决这些问题。
一、auto简介
auto声明的变量必须由编译器在编译器在编译时期推导而得。
注意:使用auto定义变量时,必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导变量的实际类型。
因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量的实际类型。
二、auto使用细则
1.auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
2.在同一行定义多个变量
auto在同一行定义的变量必须同类型,否则会报错,
因为编译器只根据第一个变量类型进行推导。
auto a = 1, b = 1.0;//会报错
auto a = 1, b = 2;//相同类型可以
3、auto不能推导的场景
1、auto不能作为函数参数(因为编译器无法对函数的实际类型进行推导)
2、auto不能直接用来声明数组
三、基于范围for的循环
对于一个有范围的集合,由程序员来说明循环范围是多余的,有时候还好容易犯错误。因此C++11中引入了基于范围for的循环。
for循环后的括号由冒号“:”分为两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
void TestFor()
{
int array[] = { 1,2,3,4,5 };
for (auto& e : array)
{
e *= 2;
}
for (auto e : array)
{
cout << e << " ";
}
}
注意:
1、for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
2、迭代的对象要实现++和==的操作。