Funktionsüberladung mit Const-Argumenten
In C ermöglicht uns die Funktionsüberladung, mehrere Funktionen mit demselben Namen, aber mit unterschiedlichen Argumenttypen oder zu definieren Zahlen. Es gibt jedoch Einschränkungen beim Überladen basierend auf der Konstanz der Argumente.
Beachten Sie den angegebenen Code:
#include <iostream> using std::cout; class Test { public: Test() {} int foo(const int) const; int foo(int); }; int main() { Test obj; Test const obj1; int variable = 0; do { obj.foo(3); // Call the const function obj.foo(variable); // Attempt to call the non-const function variable++; usleep(2000000); } while (1); } int Test::foo(int a) { cout << "NON CONST" << std::endl; a++; return a; } int Test::foo(const int a) const { cout << "CONST" << std::endl; return a; }
Dieser Code versucht, die foo-Funktion basierend auf der Konstanz des Arguments zu überladen. Der Compiler gibt jedoch einen Fehler aus, der besagt, dass die Funktion nicht überladen werden kann.
Erklärung
In C basiert das Überladen von Funktionen ausschließlich auf der Konstanz eines Nichtzeigers. Ein Nicht-Referenztyp-Argument ist nicht zulässig. Dies liegt daran, dass der Compiler nicht anhand der Konstanz des als Wert übergebenen Werts zwischen den beiden Funktionen unterscheiden kann.
Im angegebenen Code erhalten beide Versionen von foo eine Ganzzahl als Wert. Wenn das Argument als Wert übergeben wird, wird eine Kopie der Variablen erstellt und die Konstanz des formalen Parameters hat keinen Einfluss auf den Wert der Kopie.
Daher hat der Compiler keine Möglichkeit zu bestimmen, welche Version von foo soll aufgerufen werden, wenn eine nicht konstante Ganzzahl als Wert übergeben wird. Diese Mehrdeutigkeit verstößt gegen das Überladungsverbot für Funktionen mit derselben Signatur.
Alternativer Ansatz
Um das gewünschte Verhalten zu erreichen, kann ein alternativer Ansatz verwendet werden. Eine Möglichkeit besteht darin, Pass-by-Reference mit expliziter Konstanz zu verwenden, wie unten gezeigt:
int foo(const int& a); int foo(int& a);
Mit diesem Ansatz kann der Compiler zwischen den beiden Funktionen basierend auf der Konstanz der Referenz unterscheiden und so eine ordnungsgemäße Funktion ermöglichen Überlastung.
Das obige ist der detaillierte Inhalt vonKönnen C-Funktionen allein aufgrund der Konstanz eines Nicht-Zeiger- und Nicht-Referenz-Arguments überladen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!