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

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

问题描述:

我尝试了解如何在C++中使用auto。对我而言,理解某些东西的最好方式就是看一个例子。但是,我看到的例子并不那么简单。例如,这里是“Meaning of C++0x auto keyword, by example?”。为了理解这个例子,我需要知道什么是“模板”,“指针”,“malloc”等等。在C++中使用auto的最简单的例子是什么?

任何人都可以给出一个简单的例子使用自动,以便可以很容易地了解它用于什么?

+2

你的问题实际上并不是关于“自动”。它是关于“模板”,“指针”,“malloc”等。如果你不知道它们是什么,就不用担心“自动” - 找一本好书来学习。 – 2013-03-13 11:23:31

+0

甚至不需要拿到一本书 - 谷歌来拯救 - http://login2win.blogspot.co.uk/2013/02/c-auto.html – 2013-03-13 11:26:00

+1

很难确定一个具体的“这就是它”的含义。我只能提供这个。对于从其中使用它的代码*上下文*中的“类型”进行自动推导是有用的。这就像我能得到的“毯子”一样。 – WhozCraig 2013-03-13 11:30:51

int a = 10; 
int b = 20; 

auto c = a+b; // c will be int 

我假设你知道什么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的类型更改为其他容器。

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的类型。

基本上,问题是当编译器在编译时知道某个表达式的类型时,没有理由不利用这些知识,并且让编译器自动地使用它,在任何可能的上下文中完成。

,你可能做想用auto的唯一情况是,当您要执行转换,或当你想要一个变量的类型出现在其声明可读性原因之前明确。