0Pricing
C++ Academy · Lekcja

Obiekty funkcyjne i funktory

Pisz klasy z operatorem operator(), aby tworzyć wywoływalne obiekty przechowujące stan

Obiekty funkcyjne i funktory 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.

Czym jest funktor?

Funktor (obiekt funkcyjny) to klasa przeciążająca operator(). Jej instancje można wywoływać tak jak funkcje.

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

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

Dlaczego nie zwykła funkcja?

Funktory przechowują stan, czego nie robi zwykła funkcja. Stan umożliwia konfigurację, zliczanie oraz tworzenie wywołań zwrotnych zależnych od stanu.

struct Counter {
    int count = 0;
    int operator()(int x) { ++count; return x; }
};

Counter c;
c(10); c(20); c(30);
std::cout << c.count;   // 3

Konfigurowalne zachowanie

Konfigurację należy przechowywać w składowych funktora. Ten sam typ funktora działa dla wielu zestawów parametrów.

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

GreaterThan over10{10};
over10(15);    // true
over10(5);     // false

Używanie funktorów z algorytmami STL

Algorytmy STL akceptują wszystko, co można wywołać — funktory, lambdy i wskaźniki do funkcji.

std::vector<int> v = {1, 11, 5, 99, 8};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});
std::cout << *it;   // 11

Predefiniowane funktory w <functional>

Biblioteka standardowa udostępnia gotowe funktory: std::plus, std::less, std::equal_to, std::negate i inne.

#include <functional>
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater<int>{});
// sorted descending

Funktor a wskaźnik do funkcji

Funktory zwykle lepiej nadają się do rozwijania kodu, ponieważ ich operator() jest wywołaniem bezpośrednim. Wskaźniki do funkcji mogą być bardziej elastyczne, ale powodują wywołanie pośrednie.

Funktory jako parametry szablonów

Wiele kontenerów i algorytmów STL akceptuje funktor jako parametr szablonu — dotyczy to komparatorów zbiorów, funkcji skrótu i alokatorów.

std::set<int, std::greater<int>> s = {1, 2, 3};
// s iterates in descending order: 3, 2, 1

Lambdy są funktorami

Kompilator generuje unikatową klasę z operator() dla każdej lambdy. Lambdy są cukrem składniowym dla funktorów.

Kiedy napisać funktor

Warto napisać funktor ręcznie, gdy:

  • ta sama logika jest używana w wielu miejscach (aby nadać jej nazwę)
  • jest częścią publicznego API
  • musi być konstruowalny przez kopiowanie lub przenoszenie z określonym zachowaniem

Kiedy zamiast tego użyć lambdy

W przypadku jednorazowego użycia lambda jest krótsza i czytelniejsza. Dla wielokrotnego użycia nazwany funktor poprawia czytelność.

Kompozycyjność

Funktory można łączyć za pomocą std::bind lub, bardziej współcześnie, przez komponowanie lambd. Biblioteki funkcyjne, takie jak Boost, również udostępniają kombinatory.

Szybkie sprawdzenie

Jaka jest najważniejsza możliwość funktora w porównaniu ze zwykłą funkcją?

Podsumowanie

Funktor to klasa z operator(). Przechowuje stan, współpracuje z algorytmami STL i stanowi podstawę lambd. Nazwanych funktorów należy używać do wielokrotnego użycia, a lambd — do logiki jednorazowej.

Często zadawane pytania

Czy lekcja „Obiekty funkcyjne i funktory” jest bezpłatna?

Tak — pełny tekst „Obiekty funkcyjne i funktory” 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 „Obiekty funkcyjne i funktory”?

Pisz klasy z operatorem operator(), aby tworzyć wywoływalne obiekty przechowujące stan Ć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 „Obiekty funkcyjne i funktory”?

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. Obiekty funkcyjne i funktory
  2. Przechwytywanie w lambdach: przez wartość, referencję, mutable
  3. Generyczne lambdy i domknięcia w C++14
  4. std::function — wywoływalne obiekty z wymazywaniem typu
← Powrót do C++ Academy