Funktionsüberladung und Const-Argumente: Ein genauerer Blick
In C ermöglicht die Funktionsüberladung, dass mehrere Funktionen mit demselben Namen in einer Klasse vorhanden sind , sofern sie sich in ihren Parametertypen unterscheiden. Es kommt jedoch zu einer Situation, wenn versucht wird, Funktionen ausschließlich auf der Grundlage der Konstanz von Nicht-Zeiger- und Nicht-Referenzwerttypen zu überladen.
Bedenken Sie den folgenden Codeausschnitt:
#include <iostream> using namespace std; class Test { public: int foo(const int) const; int foo(int); }; int main () { Test obj; Test const obj1; int variable=0; obj.foo(3); // Call the const function obj.foo(variable); // Want to make it call the non const function }
Oben Code wird versucht, die foo-Funktion basierend auf der Konstanz des Arguments zu überladen. Der Compiler gibt jedoch einen Fehler aus, der darauf hinweist, dass eine Funktionsüberladung auf diese Weise nicht möglich ist.
Verstehen der Einschränkung
Der Grund für diese Einschränkung liegt im Art- und Weisewert Typen behandelt werden. Wenn ein Wert als Wert an eine Funktion übergeben wird, wird eine Kopie des Werts erstellt, und alle Änderungen, die innerhalb der Funktion an dieser Kopie vorgenommen werden, wirken sich nicht auf den Originalwert aus. Daher ist die Konstanz des Arguments nur im Rahmen der Funktion relevant.
Zum Beispiel in der foo-Funktion:
int Test::foo(int a) { cout << "NON CONST" << endl; a++; return a; }
Auch wenn die Funktion nicht das Schlüsselwort const hat , der Wert von a kann nicht geändert werden, da es sich um eine Kopie des ursprünglichen Werts handelt, der an die Funktion übergeben wurde.
Lösung
Um die gewünschte Funktionalität zu erreichen, kann man überladen Die Funktion foo basiert auf verschiedenen Parametertypen. Zum Beispiel könnte man foo überladen, um eine konstante Referenz auf int und eine nicht konstante Referenz auf int zu akzeptieren.
#include <iostream> using namespace std; class Test { public: int foo(const int &a) const; int foo(int &a); }; int main() { Test obj; Test const obj1; int variable = 0; obj.foo(3); // Call the const function obj.foo(variable); // Call the non-const function }
Dieser Ansatz ermöglicht eine Überladung basierend auf Parametertypen und behält gleichzeitig das gewünschte Verhalten in Bezug auf bei Konstante Korrektheit.
Das obige ist der detaillierte Inhalt vonKönnen C-Funktionen allein aufgrund der Konstanz von Nicht-Zeiger- und Nicht-Referenzwerttypen überladen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!