0Pricing
C++ Academy · Lekcja

Operatory indeksowania i wywołania funkcji

Przeciążaj [] i (), aby typy zachowywały się jak kontenery lub obiekty wywoływalne

Operatory indeksowania i wywołania funkcji to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 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[] — dostęp indeksowany

Należy przeciążyć [], aby typ był użyteczny jak tablica. Jest to przydatne w przypadku kontenerów, macierzy i klas reprezentujących obrazy.

class Vec {
    std::vector<double> data_;
public:
    double& operator[](size_t i) { return data_[i]; }
    double  operator[](size_t i) const { return data_[i]; }
};

Dwa przeciążenia: const i non-const

Należy zapewnić oba przeciążenia. Wywołanie dla instancji const wybiera przeciążenie const, natomiast wersja non-const pozwala na przypisanie.

Sprawdzanie zakresu

Standardowo zwykły operator[] nie sprawdza zakresu. Należy udostępnić osobną metodę at(), która zgłasza wyjątek — tak jak w bibliotece standardowej.

double& at(size_t i) {
    if (i >= data_.size()) throw std::out_of_range("");
    return data_[i];
}

Indeksowanie wielowymiarowe (C++23)

W C++23 dodano indeksowanie z argumentami rozdzielonymi przecinkami: m[i, j]. We wcześniejszych wersjach potrzebne jest wywołanie funkcji lub łańcuchowe indeksowanie.

// C++23
double& operator[](size_t i, size_t j);

// Pre-C++23 workaround
double& operator()(size_t i, size_t j);

operator() — wywołanie funkcji

Należy przeciążyć (), aby instancje można było wywoływać jak funkcje. Stosuje się go w przypadku funktorów, indeksowania macierzy i konfigurowalnych predykatów.

struct Square {
    int operator()(int x) const { return x * x; }
};

Square sq;
std::cout << sq(5);   // 25

Funktory ze stanem

Operator wywołania funkcji może korzystać ze zmiennych składowych, tworząc obiekt wywoływalny przechowujący stan.

struct GreaterThan {
    int threshold;
    bool operator()(int x) const { return x > threshold; }
};

GreaterThan over10{10};
std::cout << over10(15);   // true

Użycie z algorytmami STL

Instancje funktorów można przekazywać do algorytmów zamiast funkcji.

std::vector<int> v = {1, 11, 2, 22};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});

Operatory z wieloma argumentami

Zarówno [] (przed C++23), jak i () można przeciążać z dowolną liczbą argumentów. Przed C++23 () jest bardziej elastycznym wyborem w przypadku dostępu przypominającego dostęp do macierzy.

Zwracanie referencji a wartości

Należy zwrócić referencję, aby umożliwić przypisanie za pomocą indeksowania. W przypadku typów tylko do odczytu należy zwracać wartość.

Obiekty proxy

Jeśli operator[] musi zwracać złożony obiekt (na przykład pole bitowe), należy zwrócić niewielką klasę proxy z operatorami konwersji i przypisania.

Przykłady z praktyki

Typowe zastosowania:

  • std::vector::operator[]
  • std::map::operator[] — wstawia element dla brakujących kluczy
  • Klasy macierzy: m(i, j)
  • Funktory używane w algorytmach

Szybkie sprawdzenie

Jak sprawić, aby instancje klasy można było wywoływać jak funkcję?

Podsumowanie

Należy przeciążyć [] na potrzeby dostępu indeksowanego (zapewniając przeciążenia const i non-const). Należy przeciążyć (), aby instancje można było wywoływać — jest to podstawa funktorów i lambd.

Często zadawane pytania

Czy lekcja „Operatory indeksowania i wywołania funkcji” jest bezpłatna?

Tak — pełny tekst „Operatory indeksowania i wywołania funkcji” 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 „Operatory indeksowania i wywołania funkcji”?

Przeciążaj [] i (), aby typy zachowywały się jak kontenery lub obiekty wywoływalne Ć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 3 z 4.

Ile czasu zajmuje lekcja „Operatory indeksowania i wywołania funkcji”?

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. Operatory arytmetyczne i porównania
  2. Operatory wstawiania i ekstrakcji ze strumienia
  3. Operatory indeksowania i wywołania funkcji
  4. Operator porównania trójstronnego w C++20
← Powrót do C++ Academy