Представление отсутствия с optional
Избегайте нулевых указателей
«Представление отсутствия с optional» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Проблема с null
Возврат специального значения, например -1, или нулевого указателя в качестве обозначения «значения нет» ненадёжен и легко приводит к неправильному использованию. std::optional<T> явно представляет «значение или ничего». Подключите <optional>.
#include <iostream>
#include <optional>
int main() {
std::optional<int> maybe = 42;
std::cout << *maybe << "\n";
}Пустой optional
Конструирование optional по умолчанию или присваивание ему std::nullopt создаёт пустой объект, не содержащий значения.
#include <iostream>
#include <optional>
int main() {
std::optional<int> empty;
std::optional<int> also = std::nullopt;
std::cout << empty.has_value() << " " << also.has_value() << "\n";
}Проверка наличия значения
Вызовите has_value() или используйте optional непосредственно в логическом контексте, чтобы проверить, содержит ли он значение.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 5;
if (o) std::cout << "has value\n";
if (o.has_value()) std::cout << "yes\n";
}Optional как возвращаемый тип
Это идеальный вариант для функций, которые могут не выдать результат. При успехе возвращайте значение, а при ошибке — std::nullopt.
#include <iostream>
#include <optional>
std::optional<int> half(int n) {
if (n % 2 == 0) return n / 2;
return std::nullopt;
}
int main() {
auto r = half(10);
if (r) std::cout << *r << "\n";
}Чтение значения
Используйте *opt или opt.value(), когда уже знаете, что значение присутствует. Разыменование пустого optional с помощью * приводит к неопределённому поведению.
#include <iostream>
#include <optional>
int main() {
std::optional<std::string_view> name = "Ada";
if (name) std::cout << *name << "\n";
}Самодокументируемые сигнатуры
Возвращаемый тип std::optional сразу сообщает вызывающему коду, что функция может не выдать результат, поэтому комментарии не нужны.
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> getEnvName(bool present) {
if (present) return std::string("CONFIG");
return std::nullopt;
}
int main() { std::cout << getEnvName(true).has_value() << "\n"; }Сброс optional
Вызовите reset(), чтобы снова сделать optional пустым, или присвойте ему std::nullopt.
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 99;
o.reset();
std::cout << o.has_value() << "\n"; // 0
}Конструирование на месте
emplace конструирует содержащееся значение непосредственно внутри optional, избегая лишнего копирования.
#include <iostream>
#include <optional>
#include <string>
int main() {
std::optional<std::string> o;
o.emplace("built in place");
std::cout << *o << "\n";
}Optional и указатель
Обычный указатель может быть нулевым, но ничего не сообщает о владении и может стать висячим. Optional владеет своим значением непосредственно и ясно показывает, что оно может отсутствовать, без выделения памяти в куче.
Optional из ссылок?
std::optional хранит значения, а не ссылки. Чтобы иметь возможность ссылаться на существующий объект, храните указатель или используйте std::optional<std::reference_wrapper<T>>.
Когда стоит выбрать optional
Используйте его для поиска, который может не дать результата, разбора данных, который может завершиться ошибкой, или настроек, которые могут быть не заданы. На следующем уроке рассматриваются безопасные способы доступа к содержащемуся значению.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли std::optional.
Итоги
Вы изучили основы std::optional:
- Он представляет «значение или ничего» без специальных значений и null.
- Пустой optional создаётся конструированием по умолчанию или с помощью
std::nullopt. - Наличие значения проверяется с помощью
has_value()или логического условия. - Это идеальный возвращаемый тип для поиска, который может завершиться неудачей.
Часто задаваемые вопросы
Урок «Представление отсутствия с optional» бесплатный?
Да — полный текст урока «Представление отсутствия с optional» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Представление отсутствия с optional»?
Избегайте нулевых указателей Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Представление отсутствия с optional»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Представление отсутствия с optional
- Доступ к значениям optional
- Основы std::expected
- Шаблоны обработки ошибок