Dans la 5e édition de C Primer, la distinction suivante est faite :
int f(int){ /* can write to parameter */} int f(const int){ /* cannot write to parameter */}
Alors que ces deux les fonctions semblent indiscernables, elles diffèrent en effet par leur capacité à mettre à jour leurs paramètres. Cependant, ils restent distinguables dans leurs signatures de fonction.
La raison de cette non-distinction réside dans la nature « passage par valeur » des paramètres basés sur la valeur. Lorsqu'un objet est transmis à la fonction, une copie est créée, qui est le paramètre réel modifié dans la fonction. Le qualificatif const au niveau supérieur n'affecte pas la valeur de la copie, car la copie n'est pas const const. Par conséquent, du point de vue de l'appelant, les deux fonctions ont le même effet.
La surcharge des fonctions est basée sur les paramètres fournis par l'appelant. La constance d'un paramètre ne modifie pas la fonctionnalité fournie par la fonction appelée, il n'a donc aucun sens logique de faire varier l'implémentation en fonction de celui-ci. Considérons le code suivant :
f(3); int x = 1 + 2; f(x);
La fonction f() devrait se comporter de manière identique dans les deux cas, avec ou sans le qualificatif const. Fournir différentes implémentations pourrait entraîner de la confusion et des erreurs.
Contrairement aux paramètres basés sur des valeurs, les références sont transmises par référence à l'objet réel, et non à une copie. Cela permet à la fois une surcharge basée sur la constance de la référence et la transmission de la constance via des appels de fonction. Par exemple :
const T& f(const F&); T& f(F&);
Ici, l'implémentation peut varier selon que le paramètre est passé par référence const ou par référence non const.
Malgré le manque de distinction dans les signatures de fonctions, il existe un moyen d'émuler le comportement souhaité en utilisant const références :
T f(F& x_ref) { F x = x_ref; // or const F if you won't modify it ...use x for safety... }
En passant le paramètre comme référence const, le compilateur interdira toute modification du paramètre. Cela garantit la sécurité tout en offrant une interface similaire.
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!