Namespaces
Variants

Functions

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Funktionen sind C++-Entitäten, die eine Folge von statements (einen function body ) mit einem name und einer Liste von null oder mehr function parameters verknüpfen.

// Funktionsname: "isodd"
// Parameterliste hat einen Parameter, mit Namen "n" und Typ int
// Der Rückgabetyp ist bool
bool isodd(int n)
{                 // Der Körper der Funktion beginnt
    return n % 2;
}                 // Der Körper der Funktion endet

Wenn eine Funktion aufgerufen wird, z.B. in einem Funktionsaufrufausdruck , werden die Parameter aus den Argumenten initialisiert (entweder am Aufrufort bereitgestellt oder standardmäßig vorgegeben ) und die Anweisungen im Funktionsrumpf werden ausgeführt. Wenn die Parameterliste mit ... endet, können zusätzliche Argumente an die Funktion übergeben werden; eine solche Funktion wird als variadische Funktion bezeichnet.

int main()
{
    for (int arg : {-3, -2, -1, 0, 1, 2, 3})
        std::cout << isodd(arg) << ' '; // isodd wird 7 Mal aufgerufen, jedes
                                        // Mal wird n aus arg kopierinitialisiert
}

Unqualified Funktionsnamen in Funktionsaufrufausdrücken werden mit einem zusätzlichen Satz von Regeln gesucht, der als "argument-dependent lookup" (ADL) bezeichnet wird.

Eine Funktion kann durch Zurückkehren oder durch Werfen einer Exception beendet werden.

Eine Funktion kann eine Coroutine sein, in welchem Fall sie die Ausführung anhalten kann, um später fortgesetzt zu werden.

(since C++20)

Eine Funktionsdeklaration kann in jedem Gültigkeitsbereich erscheinen, aber eine Funktionsdefinition darf nur im Namensraum-Gültigkeitsbereich oder, für Member- und Friend-Funktionen , im Klassen-Gültigkeitsbereich erscheinen. Eine Funktion, die im Klassenkörper ohne Friend-Spezifizierer deklariert wird, ist eine Klassen-Member-Funktion. Solche Funktionen haben viele zusätzliche Eigenschaften, siehe Member-Funktionen für Details.

Funktionen sind keine Objekte: Es gibt keine Arrays von Funktionen und Funktionen können nicht als Wert übergeben oder von anderen Funktionen zurückgegeben werden. Zeiger und Referenzen auf Funktionen (mit Ausnahme von der main-Funktion und den meisten Standardbibliotheksfunktionen (seit C++20) ) sind erlaubt und können dort verwendet werden, wo diese Funktionen selbst nicht verwendet werden können. Daher sagen wir, dass diese Funktionen "addressierbar" sind.

Jede Funktion hat einen Typ, der sich aus dem Rückgabetyp der Funktion, den Typen aller Parameter (nach Array-zu-Zeiger- und Funktion-zu-Zeiger-Transformationen, siehe Parameterliste ) , ob die Funktion noexcept ist oder nicht (seit C++17) , und für nicht-statische Memberfunktionen, CV-Qualifikation und Ref-Qualifikation (seit C++11) zusammensetzt. Funktionstypen haben auch Sprachbindung . Es gibt keine CV-qualifizierten Funktionstypen (nicht zu verwechseln mit den Typen von CV-qualifizierten Funktionen wie int f ( ) const ; oder Funktionen, die CV-qualifizierte Typen zurückgeben, wie std:: string const f ( ) ; ). Jeder CV-Qualifizierer wird ignoriert, wenn er zu einem Alias für einen Funktionstyp hinzugefügt wird.

Mehrere Funktionen im selben Geltungsbereich können denselben Namen haben, solange ihre Parameterlisten und, für nicht-statische Memberfunktionen, cv /ref (since C++11) -Qualifikationen unterschiedlich sind. Dies wird als Function Overloading bezeichnet. Funktionsdeklarationen, die sich nur im Rückgabetyp und der noexcept-Spezifikation (since C++17) unterscheiden, können nicht überladen werden. Die Adresse einer überladenen Funktion wird anders bestimmt.

C++ implementiert anonyme Funktionen mittels Lambda-Ausdrücken .

(since C++11)

Funktionsobjekte

Neben Funktionslvalues unterstützt der Funktionsaufrufausdruck Zeiger auf Funktionen und jeden Wert eines Klassentyps, der den Funktionsaufrufoperator überlädt oder in einen Funktionszeiger konvertierbar ist (einschließlich Lambda-Ausdrücken ) (seit C++11) . Zusammen werden diese Typen als FunctionObject s bezeichnet und werden allgegenwärtig in der C++-Standardbibliothek verwendet, siehe beispielsweise die Verwendungen von BinaryPredicate und Compare .

Die Standardbibliothek bietet auch eine Reihe vordefinierter Funktionsobjekt-Templates sowie Methoden zum Zusammensetzen neuer (einschließlich std::less , std::mem_fn , std::bind , std::function (seit C++11) , std::not_fn (seit C++17) , std::bind_front (seit C++20) , std::bind_back , std::move_only_function (seit C++23) , std::copyable_function , und std::function_ref (seit C++26) ).