0Pricing
C++ Academy · Lekcja

Dostęp do wartości optional

Używaj value_or i has_value

Dostęp do wartości optional to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Operator dereferencji

Najszybszym sposobem odczytania optionala jest użycie *opt, ale tylko wtedy, gdy masz pewność, że przechowuje wartość — nie jest wykonywane żadne sprawdzenie.

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

Metoda value()

opt.value() zwraca wartość, ale zgłasza wyjątek std::bad_optional_access, jeśli optional jest pusty. Należy jej używać, gdy pusty optional oznacza rzeczywisty błąd.

#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 dla wartości domyślnych

opt.value_or(fallback) zwraca przechowywaną wartość, jeśli jest obecna, a w przeciwnym razie wartość zastępczą. Bez rozgałęzień i bez wyjątków.

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

value_or z rzeczywistymi danymi

Częstym zastosowaniem jest dostarczenie wartości domyślnej dla brakującej konfiguracji lub wyniku wyszukiwania.

#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";
}

Operator strzałkowy

W przypadku optionali przechowujących typy klasowe wyrażenie opt->member zapewnia bezpośredni dostęp do składowych (ponownie przy założeniu, że optional nie jest pusty).

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

Sprawdzenie przed dostępem

Bezpieczny idiom jest prosty: najpierw sprawdź, potem użyj. Połączenie sprawdzenia z dostępem pozwala uniknąć zarówno wyjątków, jak i niezdefiniowanego zachowania.

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

Instrukcja inicjalizująca w if

Można zadeklarować optional i sprawdzić go w jednym wierszu za pomocą instrukcji inicjalizującej w if, ograniczając jego zakres do danej gałęzi.

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

Transformacja (C++23)

Pomocnicze operacje monadyczne, takie jak transform, wywołują funkcję tylko wtedy, gdy wartość jest obecna, i zwracają nowy optional. Umożliwia to przejrzyste łączenie obliczeń.

and_then do łańcuchowania

and_then (C++23) wywołuje funkcję, która sama zwraca optional, i spłaszcza wynik. Jest to idealne rozwiązanie dla kolejnych kroków, z których każdy może się nie powieść.

Wybór akcesora

Użyj value_or, gdy masz sensowną wartość domyślną, value(), gdy pusty optional oznacza błąd, który warto zgłosić wyjątkiem, a */-> wyłącznie po jawnym sprawdzeniu.

Unikanie niezweryfikowanej dereferencji

Nigdy nie wywołuj *opt bez potwierdzenia, że optional nie jest pusty. Powoduje to niezdefiniowane zachowanie i jest częstą przyczyną awarii.

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat dostępu do optionali.

Podsumowanie

Poznałeś/Poznałaś sposoby uzyskiwania dostępu do optionali:

  • * i -> po wcześniejszym sprawdzeniu.
  • value() zgłasza wyjątek dla pustego optionala.
  • value_or dostarcza wartość domyślną.
  • Monadyczne operacje transform/and_then łączą operacje w łańcuch (C++23).

Często zadawane pytania

Czy lekcja „Dostęp do wartości optional” jest bezpłatna?

Tak — pełny tekst „Dostęp do wartości optional” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Dostęp do wartości optional”?

Używaj value_or i has_value Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Dostęp do wartości optional”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Reprezentowanie braku wartości za pomocą optional
  2. Dostęp do wartości optional
  3. Podstawy std::expected
  4. Wzorce obsługi błędów
← Powrót do C++ Academy