目录
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
auto会根据初始化的值来推断当前变量的实际类型。
- int main()
- {
- int a = 5;
- auto b = a;
- auto c = 'a';
-
- cout << typeid(b).name() << endl;
- cout << typeid(c).name() << endl;
- }
会输出int和char
1.auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
- auto a = &x;
-
- auto* b = &x;
-
- auto& c = x;
注意,声明指针的时候,表达式后面必须是地址,不能是auto* b = x;
声明引用的时候,auto后面必须加上&
2. 在同一行定义多个变量
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
实际上编译器auto底层的实现也很简单,还是会将auto替换成int
要是auto只像我们之前这样子用的话,没有任何意义,写成int/double和auto没什么区别
1.之后如果类型很长的时候,懒得写,可以让他自动推导。
2.在范围for里面用,相比于c++98的遍历要方便很多。这里不写auto写成int也可以。
c++98里面只有这种遍历的方式,数组没有length(),size()
vector有size(),string有length(),,数组长度只能通过sizeof(a)/sizeof(元素leixing)来获取
- int array[] = { 1,2,3,4,5 };
- for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
- array[i] *= 2;
- //范围for
- //依次自动取array中的数据,赋值给e..自动判断结束
- for (auto e : array)
- cout << e << " ";
这种方式e的改变不会影响数组中的值,想要改变数组中的值需要用引用
- for(auto& e : array)
-
- e *= 2;
范围for的使用条件
1. for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;
下面这种方式是错误的。
- void TestFor( int array[]) {
- for ( auto& e : array)
- cout<< e <
- }
c语言规定数组在传参的时候是用指针传递的,此时的array是指针,而不是数组,范围是不确定的。
下面的方式也是错的,当数组作为参数传入函数的时候,传入的是指针,数组长度是未知的,此时必须再传入一个n表示数组的长度,否则无法遍历数组
- void test(int a[]) {
- for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
- cout << a[i];
- }
- }
2. 迭代的对象要实现++和==的操作
(4).auto不能推导的场景
1. auto不能作为函数的参数
auto不能作为形参类型,因为编译器无法对a的实际类型进行推导,只有在调用函数的时候,才会进行传参,在这之前不知道auto类型的话,栈帧的大小,以及给a变量分配空间的大小都不知道,在编译的时候就会报错。
2. auto不能作为函数的返回值
3. auto不能用来声明数组