2010-08-13 24 views

risposta

7

$ 9.3.1 const/3 Uniti-

"una funzione membro non static può essere dichiarato, volatile o const volatile. Queste cvqualifiers influenzano il tipo di questo puntatore (9.3.2). Hanno inoltre influenzano il tipo di funzione (8.3.5) della funzione membro, una funzione membro dichiarata const è una funzione membro const, una funzione membro dichiarata volatile è una funzione membro volatile e una funzione membro dichiarata const volatile è una funzione membro volatile const. "

ecco il riassunto:

a) Un qualificatore const può essere utilizzato solo per le funzioni di classe non statiche membri

b) qualifica cv per la funzione partecipano sovraccarico

struct X{ 
    int x; 
    void f() const{ 
     cout << typeid(this).name(); 
     // this->x = 2; // error 
    } 
    void f(){ 
     cout << typeid(this).name(); 
     this->x = 2; // ok 
    } 
}; 

int main(){ 
    X x; 
    x.f();   // Calls non const version as const qualification is required 
        // to match parameter to argument for the const version 

    X const xc; 
    xc.f();  // Calls const version as this is an exact match (identity 
        // conversion) 
} 
+0

+ 1 per il riferimento normativo! –

13

Il qualificatore const alla fine della dichiarazione di una funzione membro indica che la funzione può essere richiamata su oggetti che sono essi stessi const. Le funzioni membro const promettono di non modificare lo stato di alcun membro dati non modificabile.

Le funzioni membro const possono anche essere richiamate su oggetti non const (e continuano a fare la stessa promessa).

Le funzioni membro possono essere sovraccaricate anche in const-ness. Ad esempio:

class A { 
    public: 
    A(int val) : mValue(val) {} 

    int value() const { return mValue; } 
    void value(int newVal) { mValue = newVal; } 

    private: 
    int mValue; 
}; 

A obj1(1); 
const A obj2(2); 

obj1.value(3); // okay 
obj2.value(3); // Forbidden--can't call non-const function on const object 
obj1.value(obj2.value()); // Calls non-const on obj1 after calling const on obj2 
3

Significa che non modifica l'oggetto, quindi è possibile chiamare tale metodo con un oggetto const.

cioè

class MyClass { 
public: 
    int ConvertToInteger() const; 

}; 

significa che se si dispone di

const MyClass myClass; 

è possibile chiamare

int cValue = myClass.ConvertToInteger(); 

senza un errore di compilazione, in quanto la dichiarazione di metodo indica che non cambia il dati dell'oggetto.

Problemi correlati