Я пытаюсь понять как auto
используется в C ++. Для меня лучший способ понять что-то — это увидеть пример. Однако примеры, которые я видел, не так просты. Например вот «Значение C ++ 0x авто-ключевое слово, например?Msgstr «Чтобы понять этот пример, мне нужно знать, что такое» шаблоны «,» указатели «,» malloc «и так далее.
Кто-нибудь может привести минималистичный пример использования auto, чтобы можно было легко понять, для чего он используется?
int a = 10;
int b = 20;
auto c = a+b; // c will be int
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
когда вы хотите выполнить преобразования, или когда вы хотите, чтобы тип переменной отображался в явном виде перед ее объявлением для удобства чтения.
Я полагаю, вы знаете, что 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
в какой-то другой контейнер.