0Pricing
C++ Academy · Урок

Доступ к значениям optional

Используйте value_or и has_value

«Доступ к значениям optional» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Оператор разыменования

Самый быстрый способ прочитать значение optional — использовать *opt, но только если Вы уверены, что он содержит значение: проверка при этом не выполняется.

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = 10;
    if (o) std::cout << *o << "\n";
}

Метод value()

opt.value() возвращает значение, но выбрасывает исключение std::bad_optional_access, если optional пуст. Используйте его, когда пустой optional действительно означает ошибку.

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o;
    try { std::cout << o.value() << "\n"; }
    catch (const std::bad_optional_access&) { std::cout << "empty!\n"; }
}

value_or для значений по умолчанию

opt.value_or(fallback) возвращает содержащееся значение, если оно есть, а в противном случае — fallback. Без ветвления и исключений.

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = std::nullopt;
    std::cout << o.value_or(-1) << "\n"; // -1
}

value_or с реальными данными

Обычно этот приём используют, чтобы задать значение по умолчанию для отсутствующей конфигурации или результата поиска.

#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> lookup(bool found) {
    if (found) return std::string("Pro");
    return std::nullopt;
}
int main() {
    std::cout << lookup(false).value_or("Free") << "\n";
}

Оператор стрелки

Для optional с типами-классами выражение opt->member позволяет обращаться к членам напрямую (при условии, что optional не пуст).

#include <iostream>
#include <optional>
#include <string>
int main() {
    std::optional<std::string> o = std::string("hello");
    if (o) std::cout << o->size() << "\n";
}

Проверка перед доступом

Безопасная идиома такова: сначала проверьте, затем используйте. Объединение проверки и доступа позволяет избежать как исключений, так и неопределённого поведения.

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = 7;
    if (o.has_value()) {
        int x = *o;
        std::cout << x * 2 << "\n";
    }
}

Init-выражение в if

Вы можете объявить переменную и проверить её в одной строке с помощью init-выражения в if, оставив optional в области видимости только этой ветви.

#include <iostream>
#include <optional>
std::optional<int> find() { return 3; }
int main() {
    if (auto v = find(); v.has_value())
        std::cout << *v << "\n";
}

Преобразование (C++23)

Монадные вспомогательные функции, такие как transform, применяют функцию только при наличии значения и возвращают новый optional. Это позволяет удобно выстраивать цепочки вычислений.

and_then для построения цепочек

and_then (C++23) вызывает функцию, которая сама возвращает optional, и устраняет вложенность результата. Это идеально подходит для последовательности шагов, каждый из которых может завершиться ошибкой.

Выбор средства доступа

Используйте value_or, когда у Вас есть подходящее значение по умолчанию, value(), когда пустой optional означает ошибку, достойную исключения, а */-> — только после явной проверки.

Избегайте непроверенного разыменования

Никогда не вызывайте *opt, не убедившись, что optional не пуст. Это неопределённое поведение и распространённая причина сбоев.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли доступ к optional.

Итоги

Вы узнали, как получать доступ к optional:

  • Используйте * и -> после проверки.
  • value() выбрасывает исключение для пустого optional.
  • value_or предоставляет значение по умолчанию.
  • Монадные функции transform и and_then объединяют операции в цепочки (C++23).

Часто задаваемые вопросы

Урок «Доступ к значениям optional» бесплатный?

Да — полный текст урока «Доступ к значениям optional» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Доступ к значениям optional»?

Используйте value_or и has_value Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Доступ к значениям optional»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Представление отсутствия с optional
  2. Доступ к значениям optional
  3. Основы std::expected
  4. Шаблоны обработки ошибок
← Назад к C++ Academy