在C++中使用auto的最简单的例子是什么?
我尝试了解如何在C++中使用auto
。对我而言,理解某些东西的最好方式就是看一个例子。但是,我看到的例子并不那么简单。例如,这里是“Meaning of C++0x auto keyword, by example?”。为了理解这个例子,我需要知道什么是“模板”,“指针”,“malloc”等等。在C++中使用auto的最简单的例子是什么?
任何人都可以给出一个简单的例子使用自动,以便可以很容易地了解它用于什么?
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
的唯一情况是,当您要执行转换,或当你想要一个变量的类型出现在其声明可读性原因之前明确。
你的问题实际上并不是关于“自动”。它是关于“模板”,“指针”,“malloc”等。如果你不知道它们是什么,就不用担心“自动” - 找一本好书来学习。 – 2013-03-13 11:23:31
甚至不需要拿到一本书 - 谷歌来拯救 - http://login2win.blogspot.co.uk/2013/02/c-auto.html – 2013-03-13 11:26:00
很难确定一个具体的“这就是它”的含义。我只能提供这个。对于从其中使用它的代码*上下文*中的“类型”进行自动推导是有用的。这就像我能得到的“毯子”一样。 – WhozCraig 2013-03-13 11:30:51