3

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

请任何人都可以举一个使用 auto 的简约示例,以便人们可以轻松理解它的用途?

4

4 回答 4

13
int a = 10;
int b = 20;

auto c = a+b; // c will be int
于 2013-03-13T11:23:41.910 回答
12

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)但这可以更好地作为说明。

于 2013-03-13T11:25:28.867 回答
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

基本上,关键是当编译器在编译时知道某个表达式的类型时,没有理由不利用这些知识并让编译器自动使用它,无论在什么情况下都可以这样做。

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.

于 2013-03-13T11:25:33.370 回答
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其他容器。

于 2013-03-13T11:25:18.910 回答