Im C Primer 5. Edition wird folgende Unterscheidung getroffen:
int f(int){ /* can write to parameter */} int f(const int){ /* cannot write to parameter */}
Während diese beiden Funktionen scheinen nicht unterscheidbar zu sein, sie unterscheiden sich tatsächlich in ihrer Fähigkeit, ihre Parameter zu aktualisieren. Sie bleiben jedoch in ihren Funktionssignaturen unterscheidbar.
Der Grund für diese Nichtunterscheidung liegt in der „Wertübergabe“-Natur wertbasierter Parameter. Wenn ein Objekt an die Funktion übergeben wird, wird eine Kopie erstellt, bei der es sich um den tatsächlichen Parameter handelt, der innerhalb der Funktion geändert wird. Das const-Qualifikationsmerkmal auf der obersten Ebene hat keinen Einfluss auf den Wert der Kopie, da die Kopie nicht const const ist. Daher haben aus Sicht des Aufrufers beide Funktionen den gleichen Effekt.
Überladung von Funktionen basiert auf den vom Aufrufer bereitgestellten Parametern. Die Konstanz eines Parameters verändert nicht die Funktionalität, die die aufgerufene Funktion bereitstellt, daher macht es keinen logischen Sinn, die darauf basierende Implementierung zu variieren. Betrachten Sie den folgenden Code:
f(3); int x = 1 + 2; f(x);
Es wird erwartet, dass sich die Funktion f() in beiden Fällen identisch verhält, mit oder ohne das const-Qualifikationsmerkmal. Die Bereitstellung unterschiedlicher Implementierungen kann zu Verwirrung und Fehlern führen.
Im Gegensatz zu wertbasierten Parametern werden Referenzen als Referenz auf das tatsächliche Objekt und nicht als Kopie übergeben. Dies ermöglicht sowohl eine Überladung basierend auf der Konstanz der Referenz als auch die Übergabe der Konstanz durch Funktionsaufrufe. Zum Beispiel:
const T& f(const F&); T& f(F&);
Hier kann die Implementierung variieren, je nachdem, ob der Parameter als konstante Referenz oder nicht konstante Referenz übergeben wird.
Trotz der fehlenden Unterscheidung bei Funktionssignaturen gibt es eine Möglichkeit, das gewünschte Verhalten mithilfe von Konstantenreferenzen zu emulieren:
T f(F& x_ref) { F x = x_ref; // or const F if you won't modify it ...use x for safety... }
Durch die Übergabe des Parameters als Konstantenreferenz verhindert der Compiler jegliche Änderungen am Parameter . Dies gewährleistet Sicherheit und bietet gleichzeitig eine ähnliche Schnittstelle.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet C in Funktionssignaturen für Werttypen nicht zwischen „const'- und nicht „const'-Parametern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!