1.
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
2.
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
Beide arbeiten; Welches ist der Standardweg und warum ?
c++
syntax
optional-parameters
httpinterpret
quelle
quelle
b
mehrfach definiert werden, einmal für jede Übersetzungseinheit , die beinhaltetlib.h
, ist das richtig?b
wird einmal für jede.cpp
Datei definiert, die den Header enthält. Aber das ist okay, weil Sie nur eine Deklaration derAdd
Funktion haben.In C ++ lauten die Anforderungen an Standardargumente hinsichtlich ihrer Position in der Parameterliste wie folgt:
Das Standardargument für einen bestimmten Parameter darf nicht mehr als einmal angegeben werden. Die mehrmalige Angabe (auch bei gleichem Standardwert) ist unzulässig.
Parameter mit Standardargumenten müssen am Ende der Parameterliste eine zusammenhängende Gruppe bilden.
Unter Berücksichtigung dessen können Sie in C ++ den Parametersatz "erweitern", der Standardargumente von einer Deklaration der Funktion zur nächsten enthält, solange die oben genannten Anforderungen kontinuierlich erfüllt werden.
Sie können beispielsweise eine Funktion ohne Standardargumente deklarieren
Um diese Funktion nach einer solchen Deklaration aufzurufen, müssen Sie beide Argumente explizit angeben.
Später (weiter unten) in derselben Übersetzungseinheit können Sie sie erneut deklarieren, diesmal jedoch mit einem Standardargument
und von diesem Punkt an können Sie es mit nur einem expliziten Argument aufrufen.
Weiter unten können Sie es erneut deklarieren und ein weiteres Standardargument hinzufügen
und von diesem Punkt an können Sie es ohne explizite Argumente aufrufen.
Das vollständige Beispiel könnte wie folgt aussehen
Was den Code in Ihrer Frage betrifft, sind beide Varianten vollkommen gültig, aber sie bedeuten unterschiedliche Dinge. Die erste Variante deklariert sofort ein Standardargument für den zweiten Parameter. Die zweite Variante deklariert Ihre Funktion zunächst ohne Standardargumente und fügt dann eines für den zweiten Parameter hinzu.
Der Nettoeffekt Ihrer beiden Deklarationen (dh wie er im Code nach der zweiten Deklaration angezeigt wird) ist genau der gleiche: Die Funktion verfügt über ein Standardargument für ihren zweiten Parameter. Wenn Sie es jedoch schaffen, Code zwischen der ersten und der zweiten Deklaration zusammenzudrücken, verhalten sich diese beiden Varianten unterschiedlich. In der zweiten Variante hat die Funktion keine Standardargumente zwischen den Deklarationen, daher müssen Sie beide Argumente explizit angeben.
quelle
void foo(int a = 1, int b)
sie arbeiten muss erklärt werden nachvoid foo(int a, int b = 5)
. Ja, es wird funktionieren. Und nein, es ist kein Syntaxfehler. g ++ 4.5.3 wird es perfekt kompilieren.int foo(int)
. Ich finde, dass ichint foo(int=5)
wieder schreiben kann , ohne die Parameternamen. Bisher scheint das noch niemand erwähnt zu haben.Der erste Weg wäre dem zweiten vorzuziehen.
Dies liegt daran, dass in der Header-Datei angezeigt wird, dass der Parameter optional ist und der Standardwert lautet. Dadurch wird außerdem sichergestellt, dass der Standardwert unabhängig von der Implementierung der entsprechenden CPP-Datei gleich ist.
Zweitens gibt es keine Garantie für einen Standardwert für den zweiten Parameter. Der Standardwert kann sich ändern, je nachdem, wie die entsprechende CPP-Datei implementiert ist.
quelle
Standardargumente müssen beim ersten Auftreten des Funktionsnamens angegeben werden - normalerweise im Funktionsprototyp. Wenn der Funktionsprototyp weggelassen wird, weil die Funktionsdefinition auch als Prototyp dient, sollten die Standardargumente im Funktionsheader angegeben werden.
quelle