82 votes

Pourquoi une fonction membre const peut-elle modifier un membre de données statique?

Dans le programme C++ , la modification d’un membre de données statique à partir d’une fonction const fonctionne correctement:

 class A 
{
  public:   
    static int a; // static data member

    void set() const
    {
        a = 10;
    }
};
 

Mais modifier un membre de données non statique à partir d'une fonction const ne fonctionne pas:

 class A 
{
  public:   
    int a; // non-static data member

    void set() const
    {
        a = 10;
    }
};
 

Pourquoi une fonction membre const modifier un membre de données static ?

95voto

Bathsheba Points 23209

C'est la règle, c'est tout. Et pour une bonne raison.

L' const qualifier sur une fonction membre signifie que vous ne pouvez pas modifier non-mutable nonstatic variables de membre de classe.

Par voie de offrant quelques de rationalisation, l' this pointeur en const membre qualifié de la fonction est un const type et this est intrinsèquement liée à une instance d'une classe. static des membres ne sont pas liés à une instance de classe. Vous n'avez pas besoin d'un exemple de modifier un static membre: vous pouvez le faire, dans votre cas, en écrivant A::a = 10;.

Donc, dans ton premier cas, pensez à a = 10; raccourci pour A::a = 10; et dans le second cas, pensez-y comme un raccourci pour this->a = 10;, ce qui n'est pas compilable puisque le type d' this est const A*.

21voto

Vlad from Moscow Points 36219

Selon la Norme C++ (9.2.3.2 données membres Statiques)

1 Une donnée membre statique est pas une partie de la sous-objets de classe...

Et (9.2.2.1 Le pointeur this)

1 Dans le corps d'un non-statique (9.2.1) de la fonction membre, le mot-clé c'est un prvalue expression dont la valeur est l'adresse de l'objet pour laquelle la fonction est appelée. Le type de ce membre la fonction d'une classe de X est X*. Si la fonction de membre est déclaré const, le type de ce qui est const X*,...

Et enfin (9.2.2 Non-fonctions membres statiques)

3 ... si la recherche du nom de (3.4) résout le nom de l'id de l'expression d'un non-statique non-membre de type de classe C, et si le id-l'expression est potentiellement évalué ou C est X ou une classe de base de X, l'id d'expression est transformé en un membre de la classe d'accès expression (5.2.5) à l'aide de (*this) (9.2.2.1) comme le suffixe-expression de la à gauche de l' . de l'opérateur.

Ainsi, dans cette définition de la classe

class A 
{
  public:   
    static int a; 

    void set() const
    {
        a = 10;
    }
};

la donnée membre statique a n'est pas un sous-objet d'un objet de la classe type et le pointeur this n'est pas utilisé pour accéder à la donnée membre statique. De sorte que toute fonction membre non statique constante ou non une constante ou une fonction membre statique pouvez modifier le membre de données car il n'est pas une constante.

Dans cette définition de classe

class A 
{
  public:   
    int a; 

    void set() const
    {
        a = 10;
    }
};

la non-membre de données statiques a est un sous-objet d'un objet de la classe type. Pour accéder à une fonction de membre il est utilisé soit un membre de la syntaxe d'accès de cette syntaxe est implicite. Vous ne pouvez pas utiliser un pointeur constant this de modifier le membre de données. Et le pointeur c'est en effet de type const A * dans la fonction set parce que la fonction est déclarée avec le qualificatif const. Si la fonction n'est pas de la qualifier dans ce cas, le membre de données peut être modifié.

13voto

Stephan Lechner Points 29375

Le truc, c'est que si une fonction membre d'une classe A est const, puis le type d' this est const X*, et empêche ainsi la formation de non-données membres statiques d'être modifié (cf, par exemple, C++ standard):

9.3.2 Le pointeur this [classe.c']

Dans le corps d'un non-statique (9.3) de la fonction membre, le mot clé c'est un prvalue expression dont la la valeur est l'adresse de l'objet pour lequel la fonction est appelée. Le type de cette dans une fonction membre d'une classe de X est X*. Si l' membre de la fonction est déclarée const, le type de ce qui est const X*, ...

Si a est un non-membre de données statiques, alors a=10 est le même que this->a = 10, ce qui n'est pas autorisé si le type d' this est const A* et a n'a pas été déclarée mutable. Ainsi, depuis void set() const fait le type d' this être const A*, cet accès n'est pas autorisé.

Si a est une donnée membre statique, en revanche, alors a=10 n'implique this à tous; et tant que static int a par lui-même n'a pas été déclarée const, relevé a=10 est autorisée.

1voto

Li Kui Points 321

Le qualificatif const sur une fonction membre signifie que vous ne pouvez pas modifier les membres de données de classe non-mutable , non-static .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X