2010-02-16 15 views
5

Troppo C# e troppo poco C++ mi fa girare la testa ... Qualcuno potrebbe ricordarmi cosa significa questa dichiarazione C++? Nello specifico, il finale "const". Grazie molto.Non capisco la dichiarazione del metodo const

protected: 
    virtual ostream & print(ostream & os) const 
+0

Grazie, Daniel, per l'editing per me. : D – smwikipedia

risposta

10

Metodo const semplicemente riceverà un puntatore constthis.

In questo caso il puntatore this sarà del tipo const ThisClass* const invece del solito tipo ThisClass* const.

Ciò significa che le variabili membro non possono essere modificate dall'interno di un metodo const. Nemmeno i metodi non const possono essere chiamati da tale metodo. Tuttavia una variabile membro può essere dichiarata come mutable, nel qual caso questa restrizione non si applica ad essa.

Pertanto, quando si dispone di un oggetto const, gli unici metodi che il compilatore consentirà di chiamare sono quelli contrassegnati come sicuri dalla parola chiave const.

+4

+1 per aver menzionato "this' being' const'. – Blindy

+1

a meno che i membri siano etichettati come mutabili – pm100

+0

@ pm100: Grazie. Aggiunta una nota sui membri mutabili. –

4

La desinenza const significa che la funzione print non dovrebbe essere in grado di cambiare lo stato di uno qualsiasi dei membri della classe è dichiarata (e quindi non può chiamare qualsiasi funzioni membro della classe che non sono dichiarato anche const).

Nell'esempio che segue, la funzione print nella classe Foo non può modificare le variabili membro di Foo (a meno che siano dichiarate mutable), e non può chiamare qualsiasi funzione non-const in Foo.

class Foo { 
public: 
    Foo(string value) { m_value = value; } 
protected: 
    ostream & print(ostream & os) const { 
     m_value = string("foobar"); // won't compile 
     os << m_value; 
     return os; 
    } 
private: 
    string m_value; 
}; 
3

La const sulla dichiarazione metodo indica al compilatore che la funzione è sicuro chiamare su un oggetto const del tipo della funzione è un membro di. Inoltre segnala al compilatore che la funzione non deve alterare lo stato dell'oggetto e non sarà in grado di modificare le variabili membro che non sono contrassegnate come mutable.

Se si omette il const, questo codice non funziona:

const Foo bar; 
bar.print(std::cout); // Will fail to compile unless 'print' is marked const 
1

Stai dichiarando un metodo virtuale protetto denominato print che accetta come parametro un riferimento a un ostream e restituisce un riferimento a un ostream.

La parola chiave const indica che il metodo non sarà in grado di modificare lo stato dell'oggetto, il puntatore this sarà const.

Un metodo virtuale è un metodo il cui comportamento può essere sovrascritto in una classe ereditaria, in pratica la parola chiave virtuale dà a C++ la sua capacità di supportare il polimorfismo.

E, infine, se non sai cosa è un riferimento go there

Provenendo dalla C# Suppongo che tu sai cosa significa protetto :)

Problemi correlati