在C ++中使用auto的最简单的例子是什么?

时间:2013-03-13 11:20:42

标签: c++ auto

我试着理解在C ++中如何使用auto。对我来说,理解某事的最好方法是看一个例子。但是,我看到的例子并不那么简单。例如,这里是“Meaning of C++0x auto keyword, by example?”。要理解这个例子,我需要知道什么是“模板”,“指针”,“malloc”等等。

任何人都可以使用auto给出一个简约的例子,这样可以很容易地理解它的用途吗?

4 个答案:

答案 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的类型更改为其他容器。