Aujourd'hui, j'ai un problème. J'ai besoin d'une fonction membre static
, const
n'est pas un must mais un meilleur. Mais, je n'ai pas réussi dans mes efforts. Quelqu'un peut-il dire pourquoi ou comment?
Lorsque vous appliquez le qualificatif const
à une fonction membre non statique, il affecte le pointeur this
. Pour une fonction membre qualifiée const de classe C
, le pointeur this
est de type C const*
, alors que pour une fonction membre qui n'est pas qualifiée const, le pointeur this
est de type C*
.
Une fonction membre statique n'a pas de pointeur this
(une telle fonction n'est pas appelée sur une instance particulière d'une classe), donc la qualification const d'une fonction membre statique n'a aucun sens.
Je suis d'accord avec votre question, mais malheureusement le C++ est conçu de cette façon. Par exemple:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
À ce jour, le const
est considéré dans le contexte de this
. D'une certaine manière, c'est étroit. Il peut être élargi en appliquant ce pointeur const
au-delà de this
.
c'est à dire. le const
"proposé", qui peut également s'appliquer aux fonctions static
, limitera les membres static
de toute modification.
Dans l'exemple de code, si foo()
peut être créé const
, alors dans cette fonction, A::s
Ne peut pas être modifié. Je ne vois aucun effet secondaire sur la langue si cette règle est ajoutée à la norme. Au contraire, il est amusant que cette règle n'existe pas!
Il est regrettable que C++ ne l'accepte pas selon la conception mais logiquement il y a peu de cas d'utilisation dans lesquels il valide bien.
Une fonction qui est valide au niveau de la classe (statique) peut ne pas changer de données statiques, peut-être qu'elle interrogera simplement les données qui devraient être const. Peut-être que ça devrait être comme
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
Sans entrer dans les détails, c'est parce qu'il peut y avoir ou non un objet modifié par la fonction, donc const est ambigu pour le compilateur.
Rappelez-vous que const
maintient les objets constants, mais il peut y avoir ou non un objet ici pour rester constant.