Range-based for, nullptr и enum class
Используйте возможности C++11: range-based for, nullptr и перечисления со строгой типизацией.
«Range-based for, nullptr и enum class» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Три быстрых улучшения C++11
В C++11 появилось много небольших улучшений. Вот три возможности, которыми Вы будете пользоваться каждый день: range-based for, nullptr и enum class.
Итоги цикла по диапазону
Перебирайте любой контейнер, в котором есть begin() и end(), без арифметики индексов.
for (const auto& x : v) {
process(x);
}Что он заменяет
Многословный цикл на основе итератора превращается в одну строку.
// Before C++11
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
process(*it);
}nullptr лучше NULL
nullptr — типизированный литерал нулевого указателя. Он устраняет неоднозначность разрешения перегрузки, связанную с NULL (макросом для 0).
void f(int);
void f(int*);
f(NULL); // calls f(int)
f(nullptr); // calls f(int*)Почему nullptr лучше
Последовательно используйте nullptr:
- Отдельный тип (
std::nullptr_t) - Более ясное намерение
- Работает в шаблонном метапрограммировании
- Не может случайно преобразоваться в
int
Обычное перечисление: источник ошибок
Перечисления в старом стиле помещают свои имена в объемлющую область видимости и неявно преобразуются в int.
enum Color { RED, GREEN, BLUE };
int c = RED; // implicit conversion, no warning
// RED, GREEN, BLUE leak into global scopeПеречисление с областью видимости и типизацией
C++11 требует квалификации для enum class и запрещает неявное преобразование в int.
enum class Color { Red, Green, Blue };
Color c = Color::Red;
// int n = Color::Red; // ERROR
std::cout << static_cast<int>(c); // explicit conversionУказание базового типа
Вы можете зафиксировать размер хранения перечисления enum class, задав определённый целочисленный тип.
enum class Status : uint8_t { OK = 0, FAIL = 1, RETRY = 2 };Предварительное объявление перечисления
Поскольку базовый тип известен, перечисления enum class можно объявлять предварительно — это удобно для разрыва цепочек подключений заголовков.
// header A
enum class Color : int;
// header B (full definition)
enum class Color : int { Red, Green, Blue };Когда обычное перечисление допустимо
У обычных перечислений всё ещё есть области применения: целочисленные битовые маски флагов, где действительно нужно неявное преобразование. Явно документируйте этот выбор проектирования.
Совет по модернизации
При модернизации кодовой базы постепенно заменяйте обычные перечисления на enum class. Найдите места, которые зависят от неявного преобразования в int, и добавьте static_cast.
Быстрая проверка
Почему enum class безопаснее обычного enum?
Итоги
Три быстрых улучшения C++11: цикл по диапазону избавляет от шаблонного кода итераторов, nullptr заменяет NULL, а enum class предоставляет перечисления с областью видимости и проверкой типов. Используйте все три по умолчанию.
Часто задаваемые вопросы
Урок «Range-based for, nullptr и enum class» бесплатный?
Да — полный текст урока «Range-based for, nullptr и enum class» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Range-based for, nullptr и enum class»?
Используйте возможности C++11: range-based for, nullptr и перечисления со строгой типизацией. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Range-based for, nullptr и enum class»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- auto, decltype и вывод типов
- Range-based for, nullptr и enum class
- Лямбда-выражения: захват, mutable, обобщённость
- Структурированные привязки и if-init в C++17