Maison >développement back-end >C++ >Les fonctions C peuvent-elles être surchargées uniquement en fonction de la constance des types de valeurs sans pointeur et sans référence ?
Surcharge de fonctions et arguments Const : un examen plus approfondi
En C, la surcharge de fonctions permet à plusieurs fonctions portant le même nom d'exister dans une classe , tant qu'ils diffèrent dans leurs types de paramètres. Cependant, une situation se présente lorsque l'on tente de surcharger des fonctions basées uniquement sur la constance de types de valeurs sans pointeur et sans référence.
Considérez l'extrait de code suivant :
#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 }
Dans ce qui précède code, une tentative est faite pour surcharger la fonction foo en fonction de la constance de l'argument. Cependant, le compilateur génère une erreur, indiquant que la surcharge de fonctions ne peut pas être effectuée de cette manière.
Comprendre la limitation
La raison de cette limitation réside dans la façon dont la valeur les types sont gérés. Lorsqu'une valeur est transmise par valeur à une fonction, une copie de la valeur est créée et toute modification apportée à cette copie dans la fonction n'affecte pas la valeur d'origine. Par conséquent, la constance de l'argument n'est pertinente que dans le cadre de la fonction.
Par exemple, dans la fonction foo :
int Test::foo(int a) { cout << "NON CONST" << endl; a++; return a; }
Même si la fonction n'a pas le mot-clé const , la valeur de a ne peut pas être modifiée car il s'agit d'une copie de la valeur d'origine transmise au function.
Solution
Pour obtenir la fonctionnalité souhaitée, on peut surcharger la fonction foo en fonction de différents types de paramètres. Par exemple, on pourrait surcharger foo pour accepter une référence const à int et une référence non const à int.
#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 }
Cette approche permet une surcharge basée sur les types de paramètres tout en conservant le comportement souhaité par rapport à const-exactitude.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!