P56 auto类型
这篇文章我们讲解一下有关于C++当中的auto类型,这个也算是C++里面的一个梗了,一大串auto连在一起然后让大家猜这是个什么玩意儿。这个关键字的作用是让C++来自行推断数据的类型究竟是什么,而不需要我们予以告知。这样的话我们就不需要指定具体的返回类型了,听起来是很轻松,但是不要让auto使得我们的代码更加难懂。
举个最简单的例子,我们可以直接用auto来定义变量:
auto a = 4;
auto b = "Cherno";
我们可以看到,两个类型其实不同的变量我们都可以用auto来修饰,如果我们把鼠标放到auto上面,会看到这个变量的真是类型。
那么这个时候问题就来了,这样做会不会使得C++成为一种弱变量类型的语言?是不是变得像python一样,不需要给出变量的类型,反正我所有的变量全都写auto是不是就好了?
这里我们就需要仔细地思考这种做法的好与坏,好处的话比如说我们修改了某一个函数的返回内容,但是我们不希望使用端的API发生改变,那么在使用端我们就可以用auto来承接这个函数的返回值,如下所示:
#include<iostream>
#include<string>
static std::string GetName() {
return "Cherno";
}
int main() {
auto str = GetName();
std::cout << str << std::endl;
std::cin.get();
}
那么如果我们把GetName的类型改为const char*
static const char* GetName() {
return "Cherno";
}
这样在main当中我们不需要进行任何修改,就还可以使得代码可以正常运行,这样我们就不需要更改两次代码。
但是如果我们的后续代码是与变量类型相关联的,那么这么修改肯定还是会出错的。这个时候如果不使用auto,反而能让我们提前发现问题并修改出正确的结果。
另外一个经常使用auto的情景时,如果我们有一个非常长的变量类型名,那么使用auto来替代就非常方便了。其中最常见的莫过于vector的迭代器了,我们举一个例子就可以看出这个类型名是有多长:
std::vector<std::string> strings;
strings.push_back("Apple");
strings.push_back("Orange");
for (std::vector<std::string>::iterator it = strings.begin(); it != strings.end(); it++) {
}
我们可以看到,迭代器it的类型名非常长,而且并不是那么有意义,或者说是,并不是非常关键。那么我们就可以直接用auto来替换掉这个长的没边的类型名:
for (auto it = strings.begin(); it != strings.end(); it++)
这样一下子就整洁太多了。但是如果不是这种很长的类型名,在循环的时候最好不要使用auto。
当然如果我们想用其他方式来取代这种很长的类型名也是可以的,比如我们可以使用using关键字或者是typedef关键字来代替,比如如下所示:
using vector_it = std::vector<std::string>::iterator;
或者是
typedef std::vector<std::string>::iterator vector_it;
都可以实现用一个简短的类型名代替复杂类型名的功能。
最后需要注意的是,auto只能替代类型名,auto无法替代const或者是&符号,所以如果想要使用引用需要写明auto&,不然的话也会被当作是copy。而且不止是变量可以使用auto,函数返回类型同样可以使用auto,如果这样可以使得代码更加简单的话。
以上就是本篇文章的全部内容了,希望大家能够喜欢!