什么是C ++中的auto关键字?
在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>
后几行使代码更易于遵循。
而且,它可以减少由于返回错误值而导致的任何错误。