0Pricing
C++ Academy · Lekcja

Reprezentowanie braku wartości za pomocą optional

Unikaj pustych wskaźników

Reprezentowanie braku wartości za pomocą optional to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 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.

Problem z wartością null

Zwracanie wartości specjalnej, takiej jak -1, albo pustego wskaźnika jako oznaczenia „braku wartości” jest rozwiązaniem kruchym i łatwym do niewłaściwego użycia. std::optional<T> wyraźnie reprezentuje „wartość albo nic”. Należy dołączyć <optional>.

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

Pusty optional

Utworzenie optionala domyślnie albo przypisanie mu std::nullopt daje pusty obiekt, który nie przechowuje żadnej wartości.

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

Sprawdzanie obecności wartości

Wywołaj has_value() albo użyj optionala bezpośrednio w kontekście logicznym, aby sprawdzić, czy zawiera wartość.

#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 jako typ zwracany

To doskonałe rozwiązanie dla funkcji, które mogą nie wygenerować wyniku. W przypadku powodzenia należy zwrócić wartość, a w przypadku niepowodzenia 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";
}

Odczytywanie wartości

Użyj *opt lub opt.value(), gdy masz pewność, że optional zawiera wartość. Dereferencja pustego optionala za pomocą * powoduje niezdefiniowane zachowanie.

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

Samodokumentujące się sygnatury

Typ zwracany std::optional od razu informuje kod wywołujący, że funkcja może nie zwrócić wyniku — komentarze nie są potrzebne.

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

Resetowanie optionala

Wywołaj reset(), aby ponownie opróżnić optional, albo przypisz mu std::nullopt.

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = 99;
    o.reset();
    std::cout << o.has_value() << "\n"; // 0
}

Konstruowanie w miejscu

emplace konstruuje przechowywaną wartość bezpośrednio wewnątrz optionala, unikając dodatkowego kopiowania.

#include <iostream>
#include <optional>
#include <string>
int main() {
    std::optional<std::string> o;
    o.emplace("built in place");
    std::cout << *o << "\n";
}

Optional a wskaźnik

Surowy wskaźnik może mieć wartość null, ale nie informuje o własności i stwarza ryzyko powstania wiszącego wskaźnika. Optional przechowuje swoją wartość bezpośrednio i jasno sygnalizuje możliwość jej braku, bez alokacji na stercie.

Optional z referencjami?

std::optional przechowuje wartości, a nie referencje. Aby opcjonalnie odwoływać się do istniejącego obiektu, należy przechowywać wskaźnik albo użyć std::optional<std::reference_wrapper<T>>.

Kiedy warto użyć optionala

Należy go używać w przypadku wyszukiwania, które może się nie powieść, parsowania, które może zakończyć się błędem, lub ustawień, które mogą nie być określone. Następna lekcja omawia bezpieczne sposoby uzyskiwania dostępu do przechowywanej wartości.

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat std::optional.

Podsumowanie

Poznałeś/Poznałaś podstawy std::optional:

  • Reprezentuje „wartość albo nic” bez wartości specjalnych i wartości null.
  • Może być pusty po konstrukcji domyślnej lub po użyciu std::nullopt.
  • Jego zawartość można sprawdzić za pomocą has_value() lub testu logicznego.
  • Doskonale sprawdza się jako typ zwracany przez wyszukiwanie, które może się nie powieść.

Często zadawane pytania

Czy lekcja „Reprezentowanie braku wartości za pomocą optional” jest bezpłatna?

Tak — pełny tekst „Reprezentowanie braku wartości za pomocą 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 „Reprezentowanie braku wartości za pomocą optional”?

Unikaj pustych wskaźników Ć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 1 z 4.

Ile czasu zajmuje lekcja „Reprezentowanie braku wartości za pomocą 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