我试着理解在C ++中如何使用auto
。对我来说,理解某事的最好方法是看一个例子。但是,我看到的例子并不那么简单。例如,这里是“Meaning of C++0x auto keyword, by example?”。要理解这个例子,我需要知道什么是“模板”,“指针”,“malloc”等等。
任何人都可以使用auto给出一个简约的例子,这样可以很容易地理解它的用途吗?
答案 0 :(得分:12)
int a = 10;
int b = 20;
auto c = a+b; // c will be int
答案 1 :(得分:11)
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)
,但这更适合作为插图。
答案 2 :(得分:2)
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
的类型。
基本上,关键是当编译时编译器知道某个表达式的类型时,没有理由不利用这些知识并让编译器自动使用它,无论在什么情况下都可以这样做
您可能不的唯一情况是想要使用auto
,当您想要执行转换时,或者您想要变量的类型时出于可读性的原因,在声明之前显而易见。
答案 3 :(得分:1)
我假设你知道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
的类型更改为其他容器。