2010-04-03 5 views
4

J'ai une question sur les objets constants. Dans le programme suivant:const objet en C++

class const_check{ 
    int a; 
    public: 
    const_check(int i); 
    void print() const; 
    void print2(); 
}; 

const_check::const_check(int i):a(i) {} 

void const_check::print() const { 
int a=19; 
    cout<<"The value in a is:"<<a; 
} 

void const_check::print2() { 
    int a=10; 
    cout<<"The value in a is:"<<a; 
} 

int main(){ 
    const_check b(5); 
    const const_check c(6); 
    b.print2(); 
    c.print(); 
} 

void print() est fonction membre constante de la classe const_check, donc selon la définition des constantes si toute tentative de changement int a, il devrait se traduire par une erreur mais le programme fonctionne très bien pour moi. Je pense que j'ai une certaine confusion ici, quelqu'un peut-il me dire pourquoi le compilateur ne le signale pas comme une erreur ??

Répondre

19

En écrivant

int a = 19; 

intérieur print(), vous déclarez une nouvelle variable locale a. Cela n'a rien à voir avec le int a que vous avez déclaré dans la classe const_check. La variable membre est définie comme en tant qu'observée par la variable locale. Et il est parfaitement acceptable de déclarer des variables locales dans une fonction const et de les modifier; le const ne s'applique qu'aux champs de l'objet.

Essayez d'écrire

a = 19; 

à la place, et voir une erreur apparaît.

+0

Oh, j'ai raté ça ... Silly Merci – Jony

1

Vous ne modifiez pas la variable membre a dans print() ou print2(). Vous déclarez une nouvelle variable locale a qui ombrage la variable membre a.

4

Vous ne modifiez pas la variable d'instance a vous créez une variable locale a dans chaque méthode.

-1

De plus, à moins que je ne me trompe, vous avez oublié de déclarer la variable membre const pour commencer.

+1

Cela n'a rien à voir avec ça. Quand une fonction membre est const, cela signifie que le pointeur this est un pointeur constant vers const, donc vous ne pouvez pas le modifier ou quoi que ce soit vers lequel il pointe - qui inclut les variables membres de cet objet (et même si vous n'utilisez pas explicitement ceci, vous l'utilisez toujours lors de l'accès aux variables membres depuis une fonction membre). Si une variable membre est const, vous ne pouvez pas la modifier du tout - même dans une fonction membre non-const. Mais dans une fonction membre const, vous ne pouvez pas modifier les variables de membre, qu'elles soient const ou non. –

+0

Vous avez raison - j'ai manqué qu'il a déclaré la méthode const à la place. – Puppy