0Pricing
C++ Academy · Lekcja

Range-based for, nullptr i enum class

Korzystaj z udogodnień C++11: range-based for, nullptr i silnie typowanych wyliczeń

Range-based for, nullptr i enum class 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.

Trzy szybkie usprawnienia C++11

C++11 przyniósł wiele drobnych usprawnień. Na co dzień będą Państwo używać między innymi trzech: range-based for, nullptr i enum class.

Powtórka z range-based for

Można iterować po dowolnym kontenerze, który ma metody begin() i end(), bez operowania indeksami.

for (const auto& x : v) {
    process(x);
}

Co zastępuje

Rozbudowana pętla oparta na iteratorze staje się pojedynczą linią kodu.

// Before C++11
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    process(*it);
}

nullptr jest lepsze od NULL

nullptr to typowany literał pustego wskaźnika. Eliminuje niejednoznaczność rozwiązywania przeciążenia występującą w przypadku NULL (makra oznaczającego 0).

void f(int);
void f(int*);

f(NULL);      // calls f(int)
f(nullptr);   // calls f(int*)

Dlaczego nullptr wygrywa

Należy konsekwentnie używać nullptr:

  • Ma odrębny typ (std::nullptr_t)
  • Wyraźniej komunikuje intencję
  • Działa w metaprogramowaniu szablonów
  • Nie może przypadkowo zostać przekonwertowane na int

Zwykły enum: pułapka

Wyliczenia w starym stylu wprowadzają swoje nazwy do otaczającego zakresu i niejawnie konwertują się na int.

enum Color { RED, GREEN, BLUE };
int c = RED;            // implicit conversion, no warning
// RED, GREEN, BLUE leak into global scope

enum class: zakres i typ

W C++11 enum class wymaga kwalifikowania nazw i zabrania niejawnej konwersji na int.

enum class Color { Red, Green, Blue };
Color c = Color::Red;
// int n = Color::Red;     // ERROR
std::cout << static_cast<int>(c);   // explicit conversion

Określanie typu bazowego

Można ustalić rozmiar przechowywania elementów enum class, wskazując konkretny typ całkowity.

enum class Status : uint8_t { OK = 0, FAIL = 1, RETRY = 2 };

Deklarowanie enum class z wyprzedzeniem

Ponieważ typ bazowy jest znany, klasy enum można deklarować z wyprzedzeniem — ułatwia to rozdzielanie dołączanych plików nagłówkowych.

// header A
enum class Color : int;

// header B (full definition)
enum class Color : int { Red, Green, Blue };

Kiedy zwykły enum jest odpowiedni

Zwykłe enumy nadal mają zastosowanie: na przykład jako całkowite maski bitowe flag, gdy rzeczywiście potrzebna jest niejawna konwersja. Należy jawnie udokumentować tę decyzję projektową.

Wskazówka dotycząca migracji

Podczas modernizowania bazy kodu należy stopniowo zamieniać zwykłe enumy na enum class. Warto wyszukać miejsca zależne od niejawnej konwersji na int i dodać static_cast.

Szybkie sprawdzenie

Co sprawia, że enum class jest bezpieczniejsze niż zwykłe enum?

Podsumowanie

Trzy szybkie usprawnienia C++11: range-based for usuwa powtarzalny kod iteratorów, nullptr zastępuje NULL, a enum class zapewnia enumy o ograniczonym zakresie i bezpieczne typowo. Domyślnie należy używać wszystkich trzech.

Często zadawane pytania

Czy lekcja „Range-based for, nullptr i enum class” jest bezpłatna?

Tak — pełny tekst „Range-based for, nullptr i enum class” 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 „Range-based for, nullptr i enum class”?

Korzystaj z udogodnień C++11: range-based for, nullptr i silnie typowanych wyliczeń Ć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 „Range-based for, nullptr i enum class”?

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. auto, decltype i dedukcja typów
  2. Range-based for, nullptr i enum class
  3. Wyrażenia lambda: przechwytywanie, mutable, generyczność
  4. Więzy strukturalne i if-init w C++17
← Powrót do C++ Academy