Maison > développement back-end > C++ > Pourquoi C ne fait-il pas la distinction entre les paramètres « const » et non « const » dans les signatures de fonction pour les types valeur ?

Pourquoi C ne fait-il pas la distinction entre les paramètres « const » et non « const » dans les signatures de fonction pour les types valeur ?

Barbara Streisand
Libérer: 2024-11-10 10:30:02
original
228 Les gens l'ont consulté

Why doesn't C   distinguish between `const` and non-`const` parameters in function signatures for value types?

Signatures de const et de fonction de haut niveau

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 */}
Copier après la connexion

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.

Justification de la non-distinction

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.

Surcharge basée sur la constance

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);
Copier après la connexion

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.

Exceptions : références

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&);
Copier après la connexion

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.

Pratiques de piratage et de sécurité

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...
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal