const
-
Hallo miteinander!
Ich habe eine Frage zu const.
Im Grunde habe ich begriffen, was const macht und wenn man es anwenden sollte.
Hier aber trotzdem mal ein Beispiel:Wenn ich eine solche Klasse gegeben habe:
class Class1
{ void Method1();
int MemberVariable1;}gibt es kein const hinzuzufuegen, oder?
Wenn man aber weiss, dass
void Class1::Method1()
{ MemberVariable1=MemberVariable1+1;}
so sollte man beim Aufruf von Method1() bei Class1 ein const einsetzen, oder?Sollte man das auch allgemein machen, wenn man nicht weiss, was die FUnktion macht?
..wenn man das const weglassen wuerde, machte MemberVariable1 ausserhalb der Funktion Method1 keinen Sinn, oder?Gruss,
Sonja
-
Ich glaube du hast
constnicht verstanden, denn sonst käme deine Frage gar nicht auf
Bei
constgeht es darum, dass ein Objekt / Variable zur Laufzeit nur einmal initialisiert werden darf und ab diesem Zeitpunkt nicht mehr veränderlich ist.Für eine Klasse bedeutet dies aber, das man eine Unterscheidung braucht, welche Methoden für Objekte dieser Klasse, welche als
constdeklariert wurden, zulässig sind und welche Tabu sind. D.h. insbesondere sind jene Methoden erlaubt die das Objekt selbst nicht verändern und jene, die das Objekt ändern, sind Tabu.Damit der Compiler aber weiß, welche Methoden zu welcher Gruppe gehören, musst du die Methode, die auch für
constObjekte zulässig sind, mitconstmarkieren. Typische Fälle sind hierbei Getter und Setter.#include <iostream> class foo{ int bar; public: foo(int bar) : bar(bar) {} void setBar(int new_bar) { bar = new_bar; // verändert das Objekt selbst, kann also kein const sein } int getBar() const { return bar; // keine Veränderung am Objekt selbst möglich --> kann const sein } }; int main() { const Foo a(3); a.setBar(5); // Fehler!!! std::cout << a.getBar() << std::endl; // erlaubter Zugriff für const Objekt a return 0; }Hoffe das macht das
constklarer?
-
Danke fuer den Beitrag.
..darf ich noch eine Frage stellen?
a.setBar(5) erzeugt einen Fehler, weil oben const foo a(3) definiert wurde, oder?
-
Ja, genau: setBar kann nur von nicht-konstanten Objekten aufgerufen werden.