什么是C ++中的auto关键字?

时间:2020-02-23 14:29:52  来源:igfitidea点击:

在C ++ 11中引入的auto关键字是"类型推断"功能的一部分。
类型推断是指在编译时推导变量和函数的数据类型。
因此,程序员没有义务指定确切的数据类型并将其留给编译器。

在本文中,我们将介绍使用auto关键字带来的好处和错误。

auto关键字如何工作?

主要地,变量和函数利用auto关键字来自动推导数据类型。

关于变量,初始化器确定数据类型。
但是,return语句确定函数的返回数据类型。
让我们快速看一些示例。

1.自动与变量一起使用

#include<bits/stdc++.h>
using namespace std;

int main(){
	auto i = 15;
	auto it = &i;
	cout<<i<<endl;
	cout<<*it<<endl;
	return 1;
}
</code>

输出:

15
15
</code>

在上面的代码片段中,auto关键字确定变量的数据类型。
例如," i"是整数,而" it"是指向整数的指针。

<p>Note: The 'auto' keyword can be accompanied by <code>*</code> or <code>&</code> which play a part in the type inference.</p>

即使我们没有指定它,编译器还是设法使用语句的右侧(也称为初始化器)找到了它。

<p>Note: A variable declared using auto must have an initializer otherwise the compiler will throw an error.</p>

2.自动使用功能

#include<bits/stdc++.h>
using namespace std;

auto func(){

	int x = 15;

	x += 10;

	return x;
}

int main(){

	cout<<func()<<endl;

	return 1;
}
</code>

输出:

25
</code>

在上面的代码中,func()函数的return语句有助于编译器识别该函数的返回类型。
由于该函数返回的是整数x,因此编译器立即了解到auto必须替换为整数。

auto关键字的一些重要用途

除了具有变量的"自动"的基本用法外,我们还可以将关键字应用于复杂的情况。

1.自动用于迭代器

许多复杂的数据结构都需要迭代器来提取其值。
通过跳过冗长的迭代器声明,程序员可以最大程度地减少时间损失。

vector<map<int, vector<int>>> v;
...
...
for(auto it: v){
	...
	...
}
</code>

在for循环运行期间,迭代器" it"由向量v初始化。

2.自动与功能参数一起使用

C ++要求程序员为函数声明中的参数提供数据类型。
但是,可以通过使用关键字" auto"来简化此操作。

#include<bits/stdc++.h>
using namespace std;

void func(auto x, auto st){
	cout<<x<<" "<<st<<endl;
}

int main(){
	int x = 10;
	string st = "abcd";
	func(x, st);
	return 1;
}
</code>

输出:

10 abcd
</code>

数据类型的推导发生在函数调用期间。
因此,发生变量匹配,并且编译器会为所有参数找出确切的数据类型。

auto关键字的常见错误

任何程序员都可以通过auto关键字犯错。
因此,下面列出了一些常见的错误。

1.使用auto关键字进行多个声明

通常,为了节省时间,我们可以在一个语句中初始化多个变量。
如果我们将它与auto关键字一起使用,则可能会导致问题。

下面是错误的多重声明方式。

auto x = 10, y = 10.0;
</code>

这导致不一致的推论。
由于其中一个是整数,而另一个是双精度值。

因此,以下是使用单个" auto"关键字声明多个变量的正确方法。

auto x = 10, *y = &x;
</code>

在编译时,可以将上面的auto替换为int,将x定义为整数,将y定义为指向整数的指针。

2.整数和布尔值的相似性

由于布尔值可以初始化为数字,因此在代码审查期间,人们可能会误解了由" auto"初始化的变量是整数还是布尔值。

auto x = 0;
</code>

上面的变量" x"可以是整数或者布尔值。
因此,在这种情况下,auto关键字是一个不好的编程概念。

3.存储函数返回的值

在代码修订期间,使用" auto"声明时,存储来自函数调用值的变量可能会引起混乱。
这是因为,观察者将需要遍历该函数来确定要返回的数据类型。

auto x = some_function();
auto y = some_class();
</code>

以上声明应为:

int x = some_function();
some_class y = some_class();
</code>

后几行使代码更易于遵循。
而且,它可以减少由于返回错误值而导致的任何错误。