auto关键字
auto是C++程序设计语言的关键字。自C++11以来,auto关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。C++98标准中auto关键字用于自动变量的声明,但由于使用极少且多余,在C++11中已删除这一用法。
c语言之前的用法
在很久很久之前 c语言中auto的用法是这样子的
在前面加上一个auto 就表示让这个a变成一个局部变量 使用完毕之后就自动销毁
但是呢 我们在使用完毕的时候 它会自动销毁 所以说也没必要加上auto关键字多此一举
所以说 auto关键字也就被慢慢废弃了
直到c++中 新的标准赋予了它新的用法
C++中的新用法
在c++中 auto关键字被赋予了一种新用法
auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
光说没有用 给大家敲几段代码演示下
// c++新用法 int a = 10; auto b = a;
char c = 'a'; auto d = c;
那么这个猜猜看 b的类型是什么呢?
d的类型又是什么呢?
(这里介绍下打印类型的函数 )
typeid(name).name()
我们这个时候可以发现 a b 类型一致 c d类型一致
这也就能基本说明auto的用法了吧
auto使用细则
auto与指针和引用结合起来使用 用auto声明指针类型时 用auto和auto*没有任何区别 但用auto声明引用类型时则必须加&
还是一样 我们来看代码
int x = 10; auto a = &x; auto* b = &x; auto& c = x; cout << typeid(a).name() << endl; cout << typeid(b).name() << endl; cout << typeid(c).name() << endl;
接下来我们来看看它们三个分别是什么类型
指针和int
这也就很好的解释了我上面的这句话
auto与指针和引用结合起来使用 用auto声明指针类型时 用auto和auto*没有任何区别 但用auto声明引用类型时则必须加&
当在同一行定义多个变量时 些变量必须是相同的类型 否则编译器将会报错 因为编译器实际只对第一个类型进行推导 然后用推导出来的类型定义其他变量
比如说我们写出以下代码
int a = 10, b = 20; auto c = 10, d = 20;
这样的代码就是没问题的 编译器可以运行通过
但是我们改成这样子
是不是就直接报错了
auto不能使用的场景
这里老师讲解的时候说的是两个场景 我个人以为是三个 如果说我的理解有什么误区欢迎大佬们在评论区
指正
1. 未初始化时候
这个很好理解 和引用一样 你不给我一个其他量我怎么进行推导呢?
2. 做参数的时候
这里也很明显的报错了 内容也很明确 我们不能用来做参数
3. auto不能用来定义数组
比如说我们写出以下代码
void TestAuto() { int a[] = { 1,2,3 }; auto b[3] = { 4,5,6 }; }
这里就给出了很明确的报错 auto类型不能出现在数组中
auto的使用场景
1. 变量的类型很复杂的时候
比如说以下代码
#include <string> #include <map> int main() { std::map<std::string, std::string> m{ { "bule", "蓝色" }, { "red", "红色" }}; std::map<std::string, std::string>::iterator it = m.begin(); while (it != m.end()) { //.... } return 0; }
我们这里如果不想要写这么复杂的话只需要使用一下auto关键字就可以
#include <string> #include <map> int main() { std::map<std::string, std::string> m{ { "bule", "蓝色" }, { "red", "红色" }}; auto it = m.begin(); while (it != m.end()) { //.... } return 0;
这两段代码实现的功能是一模一样的 怎么样 是不是很方便
2. 语法糖:遍历数组
在c语言中我们想要遍历一个数组是不是必须要用下标找出每个元素 然后打印啊
但是呢在c++中引入了一种新的方式
我们将这种方式称为语法糖(使用起来很方便 跟吃糖一样)
int arr[] = { 1,2,3,4,5,6,7,8,9 }; for (auto x :arr) { cout << x << ' '; }
这个的原理是什么呢?
其实就是将arr里面的值一个个赋值给x 之后打印出来
那么如果我们想要这么修改数组里面的值 这样可行嘛
很显然是不可以的
因为都说了是赋值嘛
那么这时候聪明的同学肯定就想到了两种解法了对不对
一种是引用 一种是指针
我们来看看引用可以不可以
是可以的 思路没有错
那么指针可不可以呢?
还记得我之前说过的一句话嘛?
其实就是将arr里面的值一个个赋值给x 之后打印出来
指针是不是要指向一个地址啊 所以说要取地址才可以 赋值当然不行啦
3. for遍历的限制条件
注意 如果使用的函数传参数组的话这里就不能使用for遍历了
为什么了呢?
数组传参传的是什么啊?
是不是首元素地址啊
只是把地址传递进去的话 编译器怎么会知道遍历的范围呢?
所以说会报错
nullptr指针(c++11标准中的空指针)
在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下 方式对其进行初始化:
比如说这样子的代码
两行代码都是定义空指针
但是呢 在c语言中的空指针会遇到一些错误
就像这样子
所以说在c++中引入了一个这样一个标准
我相信 通过这几个例子大家应该能够充分理解为什么引入nullptr了
所以说在我们以后的编程中 尽量使用nullptr而不使用NULL了
总结
本文简单介绍了auto关键字 和nullptr指针
由于博主的水平有限所以难免博客中会出现纰漏 希望大佬们看到之后可以即使指正
最后如果这篇博客帮助到了你 别忘了一键三连啊
阿尼亚 哇酷哇酷!