2010-08-09 9 views

Antwort

15

Weil man const ist und das andere nicht ist. Dies sind verschiedene Überladungen mit unterschiedlichen Signaturen. Der eine oder der andere wird aufgerufen, abhängig davon, ob das Objekt, das Sie anrufen, const ist.

Beispiel:

arbit x; 
x.method1(); // calls the non-const version 
arbit const &y = x; 
y.method1(); // calls the const version 

Sie sollten eine Methode als const erklären, wenn es nicht die (sichtbaren) Zustand des Objekts ändern. Damit können Sie const arbit Objekte verteilen und sicher sein ,¹ dass jemand sie nicht versehentlich ändert.

Zum Beispiel würden Sie eine Funktion setValue nicht const machen (weil es modifiziert das Objekt), aber getValueconst wäre. Auf einem const Objekt könnten Sie also getValue, aber nicht setValue anrufen.


¹ Wenn ein Wille ist, ist auch ein Weg, und es const_cast genannt wird. Aber vergiss, dass ich es dir jemals gesagt habe.

+0

Yup, C++ die const als Überlastparameter behandelt – Digikata

+0

Überlastung auf ' const kann sehr nützlich sein. Überprüfen Sie zum Beispiel 'operator []' in 'std :: vector'. –

+1

Eine konstante Elementfunktion kann sowohl für const- als auch für - und nonconst-Objekte aufgerufen werden, während eine nonconst-Elementfunktion nur für nonconst-Objekte aufgerufen werden kann. \t Wie rufe ich die const-Version der method1-Funktion hier aus einem nicht konstanten Objekt x. ist es const_cast, welches die gewünschte Operation für mich erledigen kann? – Amit

3

Sie können auch mit volatile Modifikator und eine Kombination der beiden überlasten: const volatile

#include <iostream> 
using namespace std; 

class foo { 
public: 
    void bar()    { cout << "bar()" << endl; } 
    void bar() const   { cout << "bar() const" << endl; } 
    void bar() volatile  { cout << "bar() volatile" << endl; } 
    void bar() const volatile { cout << "bar() const volatile" << endl; } 
}; 

int main() { 
    foo f; 
    f.bar(); 

    foo const f_const; 
    f_const.bar(); 

    foo volatile f_volatile; 
    f_volatile.bar(); 

    foo const volatile f_const_volatile; 
    f_const_volatile.bar(); 
} 

Das folgende Ausgabe:

bar() 
bar() const 
bar() volatile 
bar() const volatile 
Verwandte Themen