我试图了解如何auto
在 C++ 中使用。对我来说,理解某事的最好方法是看一个例子。但是,我看到的例子并不是那么简单。例如这里是“ C++0x auto 关键字的含义,例如? ”。要理解这个例子,我需要知道什么是“模板”、“指针”、“malloc”等等。
请任何人都可以举一个使用 auto 的简约示例,以便人们可以轻松理解它的用途?
我试图了解如何auto
在 C++ 中使用。对我来说,理解某事的最好方法是看一个例子。但是,我看到的例子并不是那么简单。例如这里是“ C++0x auto 关键字的含义,例如? ”。要理解这个例子,我需要知道什么是“模板”、“指针”、“malloc”等等。
请任何人都可以举一个使用 auto 的简约示例,以便人们可以轻松理解它的用途?
int a = 10;
int b = 20;
auto c = a+b; // c will be int
auto
用于类型推断,即基于表达式声明类型,而不是显式声明它。
auto val = 3; // here, val is declared as an integer
显然,这并不是一个很大的优势,int val = 3
所以让我们举一个更好的例子:
std::vector<int> container; // ...
for (auto it = container.begin(); it != container.end(); it++) {
// type of it is std::vector<int>::iterator, but you don't need to state that
}
在这里你不必关心真正的容器类型,即std::vector<int>::iterator it = c.begin()
. 此外,您可以container
从向量更改为列表,并且循环仍然可以在没有任何更改的情况下工作,it
因为可以正确推断出类型。
注意:在 C++11 中,您可以将上面的循环编写为,for( auto it: container)
但这可以更好地作为说明。
auto
对于避免输入冗长的名称很有用,这是您通常使用模板获得的。但总的来说,模式是这样的:
struct my_class_with_a_long_name { };
my_class_with_a_long_name foo()
{
my_class_with_a_long_name obj;
// ...
return obj;
}
int main()
{
auto myObj = foo();
}
但这不仅仅是关于输入更少的字符,它还与一致性有关。如果更改 的返回类型foo
,则不必显式更改 的类型myObj
。
基本上,关键是当编译器在编译时知道某个表达式的类型时,没有理由不利用这些知识并让编译器自动使用它,无论在什么情况下都可以这样做。
The only situation where you likely do not want to use auto
is when you want to perform conversions, or when you want the type of a variable to appear explicit before its declaration for readability reasons.
我假设您知道什么std::vector<int>
是(基本上是可调整大小的整数数组)。
假设您只有这样一个向量,并且想要迭代它的元素。在这里,auto
非常方便:
std::vector<int> items;
...
for (auto iter = std::begin(items); iter != std::end(items); ++iter) {
// do something with `iter'
}
虽然iter
概念上很简单(它是一个迭代器),但它的类型有点复杂(std::vector<int>::iterator
)。使用auto
使您不必拼出类型。它还可以更轻松地将类型更改为items
其他容器。