2010-07-25 21 views
3
class A{ 
private: 
    int a; 
public: 
    A() {a = 4;} 
    const int& random1() const {return a; } 
    //int&  random2() const {return a; } 
    const int* random3() const {return &a;} 
    //int*  random4() const {return &a;} 
}; 

int main(){ 
    A objA; 
    cout<<objA.random1()<<"\n"; 
    cout<<*objA.random3()<<"\n"; 
} 

random2() et random4() ne sont pas autorisés comme défini ci-dessus. Je le savais d'une manière ou d'une autre mais je ne l'ai jamais rencontré en écrivant mon propre code, jusqu'à aujourd'hui.Tout ce qui n'est pas autorisé avec les fonctions membres const?

Qu'est-ce que tous sauf ces deux cas n'est pas autorisé dans les fonctions membres const?

Toute référence au texte standard C++ sera également utile. Merci!

Répondre

10

D'abord comprendre que const T* est un pointeur vers certains T qui ne peut pas être modifié. La deuxième chose à retenir est que tous les membres sont effectivement accessibles via this->.

So (§9.3.1):

Une fonction membre non statique peut être déclarée const, volatile ou volatile const. Ces cvqualifiers affectent le type de ce pointeur (9.3.2).

Et ce qu'il fait (§9.3.2):

Dans le corps d'une fonction de membre non statique (9.3), le mot-clé est ce une expression non-lvalue dont la valeur est l'adresse de l'objet pour lequel la fonction est appelée. Le type de ceci dans une fonction membre d'une classe X est X *. Si la fonction membre est déclarée const, le type de ceci est const X *, si la fonction membre est déclarée volatile, le type de ceci est volatile X *, et si la fonction membre est déclarée const volatile, le type de ceci est const X * volatil.

A const sur une fonction rend le pointeur thisconst T*.

C'est pourquoi ces exemples échouent: Dans la variante int&, a est accessible comme this->a, this est const T*, donc a est un const int. Et const int ne peut pas être implicitement converti en int&. Pareil avec l'autre fonction. En d'autres termes, lorsqu'une fonction est const, elle est affectée d'un const sur tout ce qui est dans la classe, et vous ne pouvez pas ignorer implicitement const.

0

Les fonctions membres de const ne peuvent pas appeler une fonction membre non const, même si elles ne modifient aucune donnée de membre. Parfois, vous devez fournir des versions const et non-const de la même fonction, car ce pointeur est implicitement transmis aux fonctions membres et joue un rôle dans la résolution de surcharge.