C++ - Pourquoi la fonction membre statique ne peut pas être créé avec 'const' qualifier
Aujourd'hui j'ai eu un problème. Je suis dans le besoin d'un static
fonction membre, const
n'est pas une obligation, mais une meilleure. Mais, je n'ai pas réussi dans mes efforts. Quelqu'un peut dire pourquoi ou comment?
- Que serait un
const
fonction membre statique signifie, pour vous? - Je veux dire qu'une fonction membre statique qui ne change jamais l'un de ses entrées.
- Alors vos entrées (les paramètres de la fonction) doit être en valeur ou en const-références.
- Il n'a pas d'incidence sur la constness des arguments de fonctions de membre de toute façon. Il ne signifie pas "tout faire "const", il signifie "faire ce const".
- dites-vous que const doit être ajouté à la arguments
- Pour ce que vous avez demandé, oui.
- oui, vous avez raison. Cela n'a à mon besoin.
- serait une
const
fonction membre statique signifie, pour vous?" - Je comprendsconst
signifie ici constness dethis
qui n'est pas utilisé pour les appels statiques, mais pour moi, il pourrait facilement dire "interdire les modifications de la statique des données d'un membre" et qu'il serait utile de l'OMI
Vous devez vous connecter pour publier un commentaire.
Lorsque vous appliquez le
const
qualifier pour une fonction membre non statique, elle affecte lathis
pointeur. Pour un const qualifiés de la fonction membre de la classeC
, lethis
pointeur est de typeC const*
, alors que, pour une fonction membre qui n'est pas const-qualifié, lethis
pointeur est de typeC*
.Une fonction membre statique ne dispose pas d'un
this
pointeur (une telle fonction n'est pas appelée sur une instance particulière d'une classe), de sorte const qualification d'une fonction membre statique n'a pas de sens.const
devrait être le même pour un membre statique que pour un non-statique. Comme un exemple que ce raisonnement ne tient pas, réfléchir sur le sens destatic
, qui dépend du contexte.C const*
ouconst C*
?const
qualificatif pour les intimes type sur la gauche ou la droite n'a aucun effet.Je suis d'accord avec votre question, mais, malheureusement, le C++ est conçu de cette façon. Par exemple:
D'aujourd'hui, le
const
est envisagé dans le cadre dethis
. Dans un sens, c'est étroit. Il peut être approfondi par l'application de cetteconst
au-delà dethis
pointeur.c'est à dire le "projet"
const
, qui peuvent également s'appliquer àstatic
fonctions, restreint lestatic
membres de toute modification.Dans le code d'exemple, si
foo()
peut être faiteconst
, dans cette fonction,A::s
ne peut pas être modifié. Je ne peux pas voir n'importe quelle langue effets secondaires, si cette règle est ajoutée à la norme. Au contraire, il est amusant c'est pourquoi une telle règle n'existe pas!const
s'applique à un objet (dans le cas de fonctions membres const, l'instance sur laquelle il est appelé). Vous voulez le faire appliquer à tous les membres statiques de la classe, je suppose que si il a été pris en considération par le comité, alors qu'il n'était pas pensé pour être un assez commun l'exigence à l'appui.const
modificateur n'est pas appliqué aux membres de méthodes ou variables membres, mais à l'implicitethis
-pointeur. Depuis un membre statique méthode n'est pas liée à un objet il n'y a pas dethis
-pointeur de faireconst
.Sans entrer dans les détails, c'est parce qu'il peut ou ne peut pas être un objet modifié par la fonction, de sorte const est ambigu pour le compilateur.
Rappeler que
const
conserve les objets constante, mais il peut ou peut ne pas être un objet est ici de maintenir constant.this
pointeur. (D'ailleurs,const
ne pas garder les objets de la constante. Il empêche un particulier de pointeur ou de référence d'être utilisé pour modifier l'objet, mais la modification pourrait toujours arriver par un autre chemin)Il est regrettable que le C++ n'est pas l'accepter comme par le design, mais, logiquement, il y a quelques cas d'utilisation dans lequel il valide bien.
Une fonction qui est le niveau de la classe valide(statique) pourrait ne pas changer toutes les données statiques, peut-être que ce sera juste les données de la requête doit être const.
Peut-être il devrait être comme
Un "const fonction membre" n'est pas
l'autorisation de modifier l'objet, il est appelé, mais membre statique
les fonctions ne sont pas appelées sur un objet quelconque.
Il est utilisé directement par l'opérateur de résolution de portée.
Donc ayant un const fonction membre statique n'a pas de sens, il est donc illégal.