个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】
目录
- 作用不那么大的场景
- auto真正的价值
- auto和指针结合使用
- 注意点
- auto不能推导的场景
- 范围for
- 范围for的使用条件
作用不那么大的场景
在C++中推出了关键字auto
,其最大的价值就是自动推导。
举一个例子:
int a = 10;
int b = 20;
auto c = a;
auto d = 10 + 1.2;
这里的
变量c
的类型就是int类型
。(auto
关键字会根据右边的表达式自动推导变量c
的类型)。
同理auto关键字
根据右边的表达式10 + 1.2
来自动推导出变量d
的类型为double
。
我们可以打印出变量c和变量d的类型来看一下验证一下。
上面这个场景的话,其实关键字auto
并没有显示多大的作用,我们还不如干脆直接定义int
或double
类型就好了。
auto真正的价值
上面的代码中的vector<int>::iterator it = v.begin();
和auto it = v.begin();
是等价的,用auto关键字
的话就会很方便,可以直接把类型很长的内容直接推导出来。
其实,还有更长的类型,在某些项目的场景下,
std
是不允许进行展开的,请看:
std::map<std::string, std::string> dict;
std::map<std::string, std::string>::iterator dit = dict.begin();
//std::map<std::string, std::string>::iterator是一个类型
//我们直接用auto来进行推导,即定价于下面这种写法
auto dit = dict.begin();
上面这段代码的话用auto
就会极大的提高我们的效率,的确是非常方便,也可以一定程度上减少我们的出错的可能性。
auto和指针结合使用
指针和auto
是可以结合起来使用的。当我们使用auto
来声明指针类型是,用auto
和auto*
其实是没有任何区别的,但是要注意一点就是用auto
声明引用类型时必须加上&
。
using namespace std;
int main()
{
int a = 10;
auto x = &a;
auto* y = &a;//指定y必须是指针
auto& z = a;
cout << typeid(x).name() << endl;
cout << typeid(y).name() << endl;
cout << typeid(z).name() << endl;
*x = 1000;
*y = 2000;
z = 10000;
return 0;
}
注意点
第一点:
注意:auto关键字的使用要有一个推导,不能直接进行定义,请看:
上面这种写法是错误的,这个点一定要注意。
第二点:
当我们
在同一行中声明多个变量时
,这些变量必须时相同的类型,否则编译器就会报错,因为编译器只对第一个类型进行推导
,然后推导出来的类型定义其他变量
。
请看举例:
auto不能推导的场景
1.auto不能作为函数的参数
比如:
int Add(auto a,auto b);
这里的话就会编译失败,因为编译器无法对a的实际类型进行推导。
2.auto不能直接用来声明数组
举个例子:
这是一个错误样例,auto不能直接用来声明数组。
3.为了避免于C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法。
范围for
auto在实际中最常见的又是用法就是C++11提出的新式的for循环,还有lambda表达式
等进行配合使用。
比如说,我们来举一个auto与C++11提出的新式的for循环来进行配合使用,请看:
//范围for
#include<iostream>
using namespace std;
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
for (auto e : a)
{
cout << e << " ";
}
return 0;
}
另外,只要是数组都可以,这里会依次取数组中的数据赋值给e(e这只是一个名字,当然也可以用a或者b又或者是c
都可以),自动迭代,自动判断结束。
刚刚是读取数组中的内容,现在我们来修改数组中的内容能不能行呢?请看:
这里发现并没有改变数组中的内容,我们要知道,这里会依次读取数组中的内容并赋值给e,而e
的改变并不会影响数组中的内容。
那应该怎么办呢?
别忘了,我们可以利用引用俩该改变数组中的内容,请看:
我们能不能把这里的auto
改为int
类型呢,答案是肯定的,当然可以了,请看:
只不过推荐使用auto,因为这样的话不管数组是什么类型的,auto
都可以进行推导,减少我们出错的可能性。
范围for的使用条件
1.for循环迭代的范围必须是确定的
对于数组而言,就是数组第一个元素到最后一个元素的范围,对于类而言,应该提供begin
和end
的方法,begin和end就是for循环迭代的范围
。
还有一点需要我们注意,请看下面代码:
void TestFor(int arr[])
{
for (auto& e : arr)
{
cout << e << endl;
}
}
上述代码是错误的,因为这里for循环的范围是不确定的,同时arr
并不是数组,而是一个指针(因为数组传参了之后就是指针),这里的arr
是一个数组名,代表了首元素的地址。
2.迭代的对象要实现++和==的操作。
好了,以上就是本文的主要讲解内容,主要是C++中的关键字auto
。讲解了auto有价值有意义的几个使用场景,同时也介绍了auto
的使用规则等等。
就到这里吧,再见啦各位!!!