目录
一.auto的定义与使用
auto在同一行声明多个变量时:
二.auto不能推导的场景
1.auto不能作为函数参数
2. auto不能直接用来声明数组
三.范围for遍历
在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的 类型。然而有时候要做到这点并非那么容易,因此C++11给auto赋予了新的含义。
auto不是一个存储类型指示符,而是作为一 个类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
#include
using namespace std;
int main() {
int a = 90;
auto b = a;
double x = 15.56;
auto* c = &x;
auto& d = x;
cout << b << endl;
cout << *c << endl;
cout << d << endl;
return 0;
}
使用auto会自动推导a的类型——auto会有参照的对象进行推导。
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编 译期会将auto替换为变量实际的类型。
auto a = 1, b = 2; //正确,a,b类型相同
auto c = 3, d = 4.0;//错误,c为int,d为double型出错
void TestAuto(auto a) {
}
报错原因:在建立函数栈帧时,寄存器不知道形参,就无法确定开多大空间,没有可参照的对象就无法推导。
void TestAuto()
{
int a[] = {1,2,3};
auto b[] = {4,5,6};
}
auto”类型不能出现在顶级数组类型中,具体:
数组不能具有其中包含“auto”的元素类型,即不能出现“auto []”。
数组的初始化是在运行期间完成的,而auto 是在编译期间就完成的(先编译后运行),所以无法推导出数组元素的类型。
在学习C语言的过程中,我们学习了for循环的语法格式:for(初始化;范围;自增){},我们称其为传统的for遍历方式:
int main() {
int array[] = { 1,2,3,4,5 };
for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
cout << array[i] << " ";
}
cout << endl;
}
而今天我们来学习一种新的遍历方式:范围for遍历
范围for循环后的括号由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围。
int main(){
//范围for循环
int array[] = { 1,2,3,4,5 };
for (auto e : array) {
cout << e << " ";
}
cout << endl;
}
auto :推演出范围变量的数据类型。
e :e是范围变量的名称,该变量在循环迭代期间接受不同数组元素的值,即在第一次循环时,将数组的第一个元素拷贝给e,此时e的值是1;第二次循环时将数组的第二个元素拷贝给e,此时e的值是2;以此类推。每执行一次for语句,就要把相应的数组元素拷贝给变量e,使其存储起来。
该种遍历不仅可读,还可写:
int main() {
//范围for循环
int array[] = { 1,2,3,4,5 };
cout << "更改前的数组:" << endl;
for (auto e : array) { //仅仅可读——只能进行遍历
cout << e << " ";
}
cout << endl;
cout << "更改后的数组:" << endl;
for (auto e : array) {
e *= 2;
cout << e << " ";
}
cout << endl;
return 0;
}