C++ Funktion
Funktionen sind eine Reihe von Anweisungen, die gemeinsam eine Aufgabe ausführen. Jedes C++-Programm hat mindestens eine Funktion, die Hauptfunktionmain(), und alle einfachsten Programme können zusätzliche Funktionen definieren.
Sie können Ihren Code in verschiedene Funktionen aufteilen. Wie Sie Code in verschiedene Funktionen aufteilen, bleibt Ihnen überlassen, aber logisch gesehen basiert die Aufteilung normalerweise darauf, dass jede Funktion eine bestimmte Aufgabe ausführt.
FunktionDeklarationTeilt dem Compiler den Namen der Funktion, den Rückgabetyp und die Parameter mit. FunktionsdefinitionStellt den eigentlichen Rumpf der Funktion bereit.
Die C++-Standardbibliothek bietet eine große Anzahl integrierter Funktionen, die Programme aufrufen können. Zum Beispiel die Funktionstrcat()Eine Funktion, die zwei Zeichenketten verkettet.memcpy()Wird verwendet, um Speicher an eine andere Stelle zu kopieren.
Funktionen haben auch viele andere Namen, wie Methoden, Unterprogramme oder Prozeduren und so weiter.
Funktion definieren
Die allgemeine Form einer Funktionsdefinition in C++ ist wie folgt:
In C++ besteht eine Funktion aus einem Funktionskopf und einem Funktionsrumpf. Nachfolgend eine Liste aller Komponenten einer Funktion:
- Rückgabetyp:Eine Funktion kann einen Wert zurückgeben.return_typeIst der Datentyp des von der Funktion zurückgegebenen Werts. Einige Funktionen führen die erforderlichen Operationen aus, ohne einen Wert zurückzugeben; in diesem Fall ist return_type das Schlüsselwortvoid。
- Funktionsname:Dies ist der eigentliche Name der Funktion. Der Funktionsname und die Parameterliste bilden zusammen die Funktionssignatur.
- Parameter:Parameter sind wie Platzhalter. Wenn eine Funktion aufgerufen wird, übergibt man einen Wert an den Parameter; dieser Wert wird als aktuelles Argument bezeichnet. Die Parameterliste enthält die Typen, die Reihenfolge und die Anzahl der Parameter der Funktion. Parameter sind optional, das heißt, eine Funktion kann auch keine Parameter enthalten.
- Funktionsrumpf:Der Funktionsrumpf enthält eine Reihe von Anweisungen, die die Aufgabe definieren, die die Funktion ausführt.
Beispiel
Das Folgende istmax()Der Quellcode der Funktion. Diese Funktion hat zwei Parameter, num1 und num2, und gibt die größere der beiden Zahlen zurück:
Funktionsdeklaration
FunktionDeklarationTeilt dem Compiler den Funktionsnamen mit und wie die Funktion aufgerufen wird. Der eigentliche Funktionskörper kann separat definiert werden.
Eine Funktionsdeklaration besteht aus den folgenden Teilen:
return_type function_name( parameter list );
Für die oben definierte Funktion max() lautet die Funktionsdeklaration wie folgt:
int max(int num1, int num2);
In einer Funktionsdeklaration sind die Namen der Parameter nicht wichtig; nur die Typen der Parameter sind erforderlich. Daher ist das Folgende ebenfalls eine gültige Deklaration:
int max(int, int);
Wenn Sie eine Funktion in einer Quelldatei definieren und sie in einer anderen Datei aufrufen, ist eine Funktionsdeklaration erforderlich. In diesem Fall sollten Sie die Funktion am Anfang der Datei deklarieren, die die Funktion aufruft.
Funktion aufrufen
Wenn Sie eine C++-Funktion erstellen, definieren Sie, was die Funktion tut, und rufen dann die Funktion auf, um die definierte Aufgabe zu erfüllen.
Wenn ein Programm eine Funktion aufruft, wird die Programmsteuerung an die aufgerufene Funktion übergeben. Die aufgerufene Funktion führt die definierte Aufgabe aus. Wenn die return-Anweisung der Funktion ausgeführt wird oder wenn die schließende geschweifte Klammer der Funktion erreicht wird, wird die Programmsteuerung an das aufrufende Programm zurückgegeben.
Beim Aufrufen einer Funktion übergeben Sie die erforderlichen Argumente. Wenn die Funktion einen Wert zurückgibt, können Sie den Rückgabewert speichern. Zum Beispiel:
Beispiel
Fügen Sie die Funktion max() und die Funktion main() zusammen, und kompilieren Sie den Quellcode. Wenn die endgültige ausführbare Datei ausgeführt wird, erzeugt sie die folgenden Ergebnisse:
Max value is : 200
Funktionsparameter
Wenn eine Funktion Parameter verwenden soll, muss sie Variablen deklarieren, die die Werte der Parameter aufnehmen. Diese Variablen werden formale Parameter der Funktion genannt.Formale Parameter。
Formale Parameter sind wie andere lokale Variablen innerhalb der Funktion; sie werden beim Eintritt in die Funktion erzeugt und beim Verlassen der Funktion zerstört.
Beim Aufruf einer Funktion gibt es drei Möglichkeiten, Argumente an die Funktion zu übergeben:
| Aufruftyp | Beschreibung |
|---|---|
| Wertübergabe | Diese Methode weist dem formalen Parameter der Funktion den tatsächlichen Wert des Arguments zu. In diesem Fall hat eine Änderung des formalen Parameters innerhalb der Funktion keine Auswirkung auf das tatsächliche Argument. |
| Aufruf per Zeiger | Diese Methode weist dem formalen Parameter die Adresse des Arguments zu. Innerhalb der Funktion wird die Adresse verwendet, um auf das beim Aufruf verwendete tatsächliche Argument zuzugreifen. Das bedeutet, dass eine Änderung des formalen Parameters das tatsächliche Argument beeinflusst. |
| Aufruf per Referenz | Diese Methode weist dem formalen Parameter eine Referenz auf das Argument zu. Innerhalb der Funktion wird die Referenz verwendet, um auf das beim Aufruf verwendete tatsächliche Argument zuzugreifen. Das bedeutet, dass eine Änderung des formalen Parameters das tatsächliche Argument beeinflusst. |
Standardmäßig verwendet C++die Übergabe per Wert, um Parameter zu übergeben. Im Allgemeinen bedeutet dies, dass der Code innerhalb der Funktion die Argumente, die zum Aufruf der Funktion verwendet wurden, nicht ändern kann. In dem zuvor erwähnten Beispiel wurde dieselbe Methode beim Aufruf der Funktion max() verwendet.
Standardwerte für Parameter
Wenn Sie eine Funktion definieren, können Sie für jeden der folgenden Parameter in der Parameterliste einen Standardwert angeben. Beim Aufruf der Funktion wird dieser Standardwert verwendet, wenn das tatsächliche Argument leer gelassen wird.
Dies geschieht, indem Sie den Zuweisungsoperator in der Funktionsdefinition verwenden, um den Parametern Werte zuzuweisen. Wenn die Funktion aufgerufen wird und für einen Parameter kein Wert übergeben wird, wird der Standardwert verwendet; wenn ein Wert angegeben wird, wird der Standardwert ignoriert und der übergebene Wert verwendet. Siehe das folgende Beispiel:
Beispiel
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
Total value is :300 Total value is :120
Lambda-Funktionen und -Ausdrücke
C++11 bietet Unterstützung für anonyme Funktionen, sogenannte Lambda-Funktionen (auch Lambda-Ausdrücke genannt).
Lambda-Ausdrücke behandeln Funktionen als Objekte. Lambda-Ausdrücke können wie Objekte verwendet werden, zum Beispiel können sie Variablen zugewiesen und als Argumente übergeben werden, und sie können auch wie Funktionen ausgewertet werden.
Lambda-Ausdrücke sind im Wesentlichen sehr ähnlich zu Funktionsdeklarationen. Die konkrete Form eines Lambda-Ausdrucks ist wie folgt:
[capture](parameters)->return-type{body}
Zum Beispiel:
[](int x, int y){ return x < y ; }
Wenn es keinen Rückgabewert gibt, kann dies wie folgt ausgedrückt werden:
[capture](parameters){body}
Zum Beispiel:
[]{ ++global_x; }
In einem komplexeren Beispiel kann der Rückgabetyp wie folgt explizit angegeben werden:
[](int x, int y) -> int { int z = x + y; return z + x; }
In diesem Beispiel wird ein temporärer Parameter z erstellt, um das Zwischenergebnis zu speichern. Wie bei einer gewöhnlichen Funktion bleibt der Wert von z nicht erhalten, bis diese unbenannte Funktion das nächste Mal aufgerufen wird.
Wenn eine Lambda-Funktion keinen Wert zurückgibt (zum Beispiel void), kann ihr Rückgabetyp vollständig weggelassen werden.
Auf Variablen im aktuellen Gültigkeitsbereich kann innerhalb eines Lambda-Ausdrucks zugegriffen werden; dies ist das Closure-Verhalten von Lambda-Ausdrücken. Anders als bei JavaScript-Closures unterscheidet die C++-Variablenübergabe zwischen Übergabe nach Wert und Übergabe nach Referenz. Dies kann durch die vorangestellten [] angegeben werden:
[] // 沒有定义任何变量。使用未定义变量会引发错误。 [x, &y] // x以传值方式传入(默认),y以引用方式传入。 [&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。 [=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。 [&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。 [=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
Noch ein Hinweis. Bei den Formen [=] oder [&] kann der Lambda-Ausdruck direkt den this-Zeiger verwenden. Bei der Form [] muss der this-Zeiger jedoch explizit übergeben werden, wenn er verwendet werden soll:
[this]() { this->someFunc(); }();
Weitere Erweiterungen