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); // 25Funktory 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); // trueUż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
- Operatory arytmetyczne i porównania
- Operatory wstawiania i ekstrakcji ze strumienia
- Operatory indeksowania i wywołania funkcji
- Operator porównania trójstronnego w C++20