0Pricing
C++ Academy · Lektion

Funktionsobjekte und Funktoren

Schreiben Sie Klassen mit operator(), um zustandsbehaftete aufrufbare Objekte zu erstellen.

Funktionsobjekte und Funktoren ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Funktor?

Ein Funktor (Funktionsobjekt) ist eine Klasse, die operator() überlädt. Instanzen können wie Funktionen aufgerufen werden.

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

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

Warum nicht einfach eine Funktion?

Funktoren besitzen einen Zustand. Eine einfache Funktion besitzt keinen. Ein Zustand ermöglicht Konfiguration, Zählungen und zustandsbehaftete Callbacks.

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

Konfigurierbares Verhalten

Speichern Sie die Konfiguration in den Membern des Funktors. Derselbe Funktortyp funktioniert mit vielen Parametersätzen.

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

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

Funktoren mit STL-Algorithmen verwenden

STL-Algorithmen akzeptieren alles, was aufrufbar ist – Funktoren, Lambdas und Funktionszeiger.

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

Vordefinierte Funktoren in <functional>

Die Standardbibliothek stellt fertige Funktoren bereit: std::plus, std::less, std::equal_to, std::negate und weitere.

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

Funktor oder Funktionszeiger

Funktoren lassen sich meist besser inline optimieren, weil ihr operator() direkt aufgerufen wird. Funktionszeiger sind möglicherweise flexibler, führen aber zu einem indirekten Aufruf.

Funktoren als Template-Parameter

Viele STL-Container und -Algorithmen akzeptieren einen Funktor als Template-Parameter – etwa für Vergleiche in Mengen, Hash-Funktionen oder Allokatoren.

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

Lambdas sind Funktoren

Der Compiler generiert für jedes Lambda eine eindeutige Klasse mit operator(). Lambdas sind syntaktischer Zucker für Funktoren.

Wann Sie einen Funktor schreiben sollten

Verwenden Sie einen selbst geschriebenen Funktor, wenn:

  • dieselbe Logik an vielen Stellen verwendet wird (geben Sie ihr einen Namen)
  • sie Teil Ihrer öffentlichen API ist
  • sie sich mit einem bestimmten Verhalten kopier- oder verschiebekonstruieren lassen muss

Wann Sie stattdessen ein Lambda verwenden sollten

Für eine einmalige Verwendung ist ein Lambda kürzer und übersichtlicher. Für wiederverwendbares Verhalten verbessert ein benannter Funktor die Lesbarkeit.

Komponierbarkeit

Kombinieren Sie Funktoren mit std::bind oder, moderner, indem Sie Lambdas kombinieren. Funktionale Bibliotheken wie Boost stellen ebenfalls Kombinatoren bereit.

Schnelltest

Welche wesentliche Fähigkeit besitzt ein Funktor im Vergleich zu einer einfachen Funktion?

Zusammenfassung

Ein Funktor ist eine Klasse mit operator(). Er besitzt einen Zustand, lässt sich in STL-Algorithmen integrieren und bildet die Grundlage für Lambdas. Verwenden Sie benannte Funktoren für wiederverwendbares Verhalten und Lambdas für einmalige Logik.

Häufig gestellte Fragen

Ist die Lektion „Funktionsobjekte und Funktoren“ kostenlos?

Ja — der vollständige Text von „Funktionsobjekte und Funktoren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Funktionsobjekte und Funktoren“?

Schreiben Sie Klassen mit operator(), um zustandsbehaftete aufrufbare Objekte zu erstellen. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Funktionsobjekte und Funktoren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Funktionsobjekte und Funktoren
  2. Lambda-Captures: per Wert, per Referenz, mutable
  3. Generische Lambdas und Closures in C++14
  4. std::function: typgelöschte aufrufbare Objekte
← Zurück zu C++ Academy