Warum sollte default-Parameter Hinzugefügt werden, der Letzte in C++ - Funktionen?
Warum sollte default-Parameter Hinzugefügt werden, der Letzte in C++ - Funktionen?
- Es ist nicht nutzlos. Verständnis design-Sprache (und insbesondere die Gestaltung der Sprache(N), die Sie verwenden) sollte IMO gefördert werden. Um dies zu tun, unter andere Dinge, die Sie brauchen, um herauszufinden, warum Ihre Ideen für "offensichtliche, einfache" Verbesserungen, die unpraktisch sind, wenn Sie unpraktisch sind. Und warum die Entwickler der Sprache die Möglichkeit verpasst, wenn Sie nicht unpraktisch. Ich bin mir ziemlich sicher, dass design-Sprache ist im Zusammenhang mit der Programmplanung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Vereinfachung der Sprache-definition-und halten Sie code lesbarer.
Nennen, und nutzen Sie den Standardwert, müssen Sie würden Sie eine syntax wie diese:
War wahrscheinlich fühlte sich zu seltsam. Eine weitere alternative ist die Angabe von Namen in der argument-Liste:
Ein neues symbol verwendet werden, da diese schon etwas bedeutet:
Die Benennung Ansatz wurde in Betracht gezogen und verworfen, die von der ISO-Ausschuss, weil Sie sich unwohl mit der Einführung einer neuen Bedeutung, um die Namen der parameter, die außerhalb der definition der Funktion.
Wenn Sie interessiert sind, mehr C++ design Begründungen, Lesen Das Design und Evolution von C++ von Stroustrup.
y
. So wie es jetzt ist, nur von hinten nach vorne.Wenn du definieren Sie die folgende Funktion:
Wie würden Sie die Funktion, und geben Sie einen Wert für a und c, aber lassen b als Standard?
Im Gegensatz zu einigen anderen Sprachen (z.B. Python), Funktions-Argumenten in C/C++ kann nicht qualifiziert werden durch Namen, wie die folgenden:
Wenn das möglich wäre, dann ist die Standard-Argumente, die überall sein könnte in der Liste.
foo(10, , 5)
oderfoo 10,, 5
. Aber es ist hässlich und weniger lesbarVorstellen, Sie hatte eine Funktion, mit diesem Prototyp:
Nehmen wir nun an rief ich die Funktion wie folgt:
Wie ist der compiler, der soll herausfinden, welche Parameter ich liefern soll-Werte für?
Da die meisten Antworten weisen darauf hin, dass default-Parameter potentiell überall in der parameter-Liste erhöht die Komplexität und Mehrdeutigkeit von Funktion aufruft (für den compiler und wohl noch wichtiger für die Nutzer der Funktion).
Das schöne an C++ ist, dass es oft ein Weg, das zu tun, was Sie wollen (auch wenn es nicht immer eine gute Idee). Wenn Sie wollen, um Standard-Argumente für die verschiedenen parameter-Positionen, können Sie fast sicher tun dies, indem Sie schreiben überladungen, drehen Sie einfach um und nennen Sie die voll-parametrisierte Funktion inline:
Und dort haben Sie das äquivalent von:
Als eine Allgemeine Regel, die Parameter der Funktion sind vom compiler verarbeitet und platziert auf dem stack von rechts nach Links um. Deshalb macht es Sinn, dass alle Parameter mit default-Werten sollten zuerst ausgewertet werden.
(Diese applieds auf __cdecl, die dazu neigt, den Standard für VC++ und __stdcall-Funktion-Deklarationen).
Sein, weil es verwendet die relative position Argumente zu finden, um die Parameter, die Sie entsprechen.
Könnte es benutzt haben, die Arten zu identifizieren, die einen optionalen parameter nicht gegeben war. Aber eine implizite Konvertierung könnte es stören. Ein weiteres problem wäre, Fehler in der Programmierung, dass interpretiert werden könnte als optionale Argumente, die drop-out-anstelle des fehlenden argument-Fehler.
Damit ein argument zu einer Option werden, sollte es eine Möglichkeit zum identifizieren der Argumente, um sicherzustellen, gibt es keine Fehler bei der Programmierung zu entfernen oder Unklarheiten. Dies ist möglich, in einige Sprachen, aber nicht in C++.
Andere Sache, dass die Normen-Ausschuss hatte zu prüfen, war, wie default-Parameter in Wechselwirkung mit anderen Funktionen, wie überladene Funktionen, template-Auflösung, und lookup von Namen. Diese Funktionen interagieren auf sehr komplexe und schwer zu beschreiben, Möglichkeiten schon. Machen Standard-Parameter können überall auftreten, Sie würde nur erhöhen die Komplexität.
Es ist eine Frage über call-convention.
Aufruf-Konvention:
Wenn Sie eine Funktion aufrufen, die Parameter sind gedrückt stack von rechts nach Links.
z.B.
den stack so, wie diese:
ein
b
c
also, wenn Sie den Standard-Wert von Links nach rechts so:
und rufen wie diese:
Ihren Anruf heißt a = 4, b = 5 und c = kein Wert; //das ist falsch!
wenn Sie die Funktion deklarieren, wie diese:
fun(int a, int b = 2, int c = 3);
und rufen wie diese:
fun(4, 5);
Ihren Anruf heißt a = 4, b = 5 und c = Standardwert(3); //das ist richtig!
Abschließend sollten Sie den Standardwert von rechts nach Links.
Jing Zeng korrekt ist. Hinzufügen möchte ich, dass meine Ausführungen hier. Wenn eine Funktion aufgerufen wird, die Argumente auf dem Stapel von rechts nach Links. Zum Beispiel, sagen wir, Sie haben diese willkürliche Funktion.
Hier wird der stack-frame der Funktion:
Diesem Diagramm oben ist der stack-frame für diese Funktion! Wie Sie sehen können, zuerst b auf dem Stapel, dann wird auf dem Stapel abgelegt. Nach, dass die Funktion return Adresse auf dem Stapel abgelegt. Die Funktion return Adresse hält die Lage in main (), von wo die Funktion, die ursprünglich genannt wurde, und nachdem die Funktion fertig ausgeführt wird, wird die Ausführung des Programms geht, die Funktion der return-Adresse. Dann werden alle lokalen Variablen, die Sie wie c auf dem Stapel abgelegt.
Nun ist die wichtige Sache ist, dass Argumente auf dem Stapel von rechts nach Links. Grundsätzlich sind alle Parameter standardmäßig ausgeliefert werden sind Literale Werte, die gespeichert sind in den code-Abschnitt der ausführbaren Datei. Wenn die Programmausführung auf einen default-parameter, ohne ein entsprechendes argument, es drückt den literalen Wert auf dem stack. Dann sieht es bei ein und schiebt das argument den Wert auf dem stack. Der stack-pointer zeigt immer auf die Spitze des Stacks, zuletzt schob variable. Also alle Literale Werte, die Sie auf dem Stapel als default-Parameter sind "hinter" den stack-pointer.
War es wohl effizienter, wenn der compiler schnell erste push-beliebigen Standard-Literale Werte auf dem stack zuerst, da Sie nicht gespeichert in einem Speicher, und Aufbau der Stapel schnell. Überlegen Sie, was gewesen wäre, wenn die Variablen gewesen wäre, auf dem Stapel zuerst, und dann die Literale. Zugriff auf einen Speicherbereich für die CPU nimmt eine relativ lange Zeit im Vergleich zu dem ziehen ein literal mit dem Wert aus einer Schaltung oder CPU-register. Da braucht es mehr Zeit, um push-Variablen auf den stack vs. Literale die Literale warten müsste, dann die Adresse zurück, die warten müssten, und die lokalen Variablen hätte zu warten, als gut. Es ist wahrscheinlich nicht ein großes Problem, in der Effizienz, aber das ist nur meine Theorie dafür, warum die default-Argumente werden immer in der am weitesten rechts liegenden Positionen der header-Funktion in C++. Es bedeutet, dass der compiler wurde entwickelt, als solche.