目录
在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的 类型。然而有时候要做到这点并非那么容易,因此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;
- }