class arbit
{
int var;
public:
int method1();
int method1() const;
};
Warum gibt g ++ keine Warnung aus, wenn die gleiche Funktion hier zweimal deklariert wird?Eine Funktion in C++ - Klasse neu deklarieren
class arbit
{
int var;
public:
int method1();
int method1() const;
};
Warum gibt g ++ keine Warnung aus, wenn die gleiche Funktion hier zweimal deklariert wird?Eine Funktion in C++ - Klasse neu deklarieren
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 getValue
const
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.
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
Yup, C++ die const als Überlastparameter behandelt – Digikata
Überlastung auf ' const kann sehr nützlich sein. Überprüfen Sie zum Beispiel 'operator []' in 'std :: vector'. –
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