const vor oder hinter methode?
-
Hallo,
ich wundere mich gerade warum man const vor und hinter die methode schreiben kann...ich dachte wenn ich const hinter eine methode schreibe dann heißt es dass die methode keine memebervariablen der klasse ändern kann bzw. auch keine nicht-const funktionen aufrufen kann. Ist da ein unterschied zwischen const davor bzw. dahinter?
-
Ja,
const
davor gehört zum Rückgabetypen, währendconst
dahinter sich so verhält, wie du sagst.
-
Kannst du das mal an einem Quelltext erläutern, was du meinst?
int const foo() { }
Die Methode
foo
ist hier nicht konstant, sondern der zurückgegebene Wert ist konstant. Womöglich damit verwechselt?
Denn bei Variablen kann man const vor und danach hinschreiben. Bei Referenzen und Zeigern muss man dann allerdings ein wenig aufpassen.Grüssli
-
hmmm...heißt das jetzt dass const vor einer methode also für den rückgabetypen soviel heißt dass ich einen nicht mehr zu verändernde konstante zurückgebe? Dann muss aber wohl auch der typ der aufruft constant sein oder? Bsp:
das wäre nicht legal oder weil a nicht const ist?
int a = 9; a = foo(); //irgendwo definitiert const int foo() { return 2; }
und was heißt const hinter variablen?
-
gambo schrieb:
das wäre nicht legal oder weil a nicht const ist?
Doch, du kopierst ja die Konstante und Konstante kann man immer kopieren, sofern sie dies nicht explizit verhindern. Aber der temporäre Wert, welcher bei der Rückgabe entsteht, ist konstant, dem kann man also nichts zuweisen.
Mein Beispiel oben macht vielleicht nicht besonderns viel Sinn, meistens macht man sowas zum Beispiel, um kontante Referenzen zurückzugeben.
int const& foo() { static int value = 0; return value; } // ... int x = foo(); // geht, da kopiert. int const& x = foo(); // geht auch und es wird nicht kopiert. // man kann aber die Variable x nicht verändern. // Bei grossen Objekten kann man so Performance gewinnen, // da keine teure Kopie benötigt wurde.
gambo schrieb:
und was heißt const hinter variablen?
Das die Variable konstant ist.
// Konstanter Wert: const Typ x; Typ const x; // Konstanter Zeiger auf nicht konstanten Wert: Typ* const x; // Nicht konstanter Zeiger auf konstanten Wert: const Typ* x; Typ const* x; // Konstanter Zeiger auf konstanten Wert: const Typ* const x; Typ const* const x; // Referenz auf konstanten Wert: const Typ& x; Typ const& x; // Eine konstante Referenz an sich gibt es nicht, da man eine Referenz nicht mehr umbiegen kann. // Sie ist also per Standard konstant.
Grüssli
-
aha. na das muss ich erstmal verdauen...
ich verstehe es leider noch nicht. Es macht doch keinen Sinn etwas konstantes zurückzugeben und es in eine variable zu speichern die dann ihren wert ändern darf. oder versteh ich hier was falsch?
aber danke schonmal für die Hilfe
-
Das const für einen Rückgabewert ist zB für Zeiger inetressant. Nehmen wir mal an du hast eine Klasse, die hat einen Zeiger auf char, in dem lagert ein CString, den willst du ausgeben. Nun machst du als Ausgabefunktion eine Funktion mit const Rückgabe. Das ergebniss ist das der zeiegr der die Rückgabe aufnimtm zwar den bereich auf den er zeigen kann ändern darf, er ist ja nicht const, aber der Bereich auf den er Zeigt ist für ihn const, er darf ihn nicht verändern, Ergebniss der Sache ist du hast sichergestellt das keiner den CSTring umschreibt aueßrhalbd er Klasse.
-
Xebov schrieb:
Das ergebniss ist das der zeiegr der die Rückgabe aufnimtm zwar den bereich auf den er zeigen kann ändern darf, er ist ja nicht const, aber der Bereich auf den er Zeigt ist für ihn const, er darf ihn nicht verändern, Ergebniss der Sache ist du hast sichergestellt das keiner den CSTring umschreibt aueßrhalbd er Klasse.
Kannst du das vielleicht verständlicher und mit weniger Widersprüchen formulieren? Im Übrigen kann man vor den Abschicken den Thread nochmals lesen und damit die meisten Tippfehler beheben.
Objekte werden selten als
const
zurückgegeben, aus dem Grund, weil man sie meistens irgendwo zuweist und damit kopiert. Was man eher sieht, sind wie Xebov antönte Zeiger und Referenzen, die aufconst
-Objekte verweisen.class MyClass { private: std::string Name; public: // ... std::string const& GetName() // Rückgabe einer Const-Referenz. { return Name; } };
Man will eine Referenz zurückgeben, um die Kopie zu vermeiden. Da man aber nur lesenden Zugriff auf den String gewähren will, nimmt man eine Const-Referenz, also eine Referenz auf ein konstantes Objekt. Aber Dravere sagte eigentlich fast alles dazu, vielleicht hilft es dir, seinen Post nochmals zu lesen.
-
Nexus schrieb:
Xebov schrieb:
Das ergebniss ist das der zeiegr der die Rückgabe aufnimtm zwar den bereich auf den er zeigen kann ändern darf, er ist ja nicht const, aber der Bereich auf den er Zeigt ist für ihn const, er darf ihn nicht verändern, Ergebniss der Sache ist du hast sichergestellt das keiner den CSTring umschreibt aueßrhalbd er Klasse.
Kannst du das vielleicht verständlicher und mit weniger Widersprüchen formulieren? Im Übrigen kann man vor den Abschicken den Thread nochmals lesen und damit die meisten Tippfehler beheben.
Ja ich weiß, meine Rechtschreibung ist grauenhaft :D. Es ist aber nicht wiedersprüchlich, es ist nur nicht ganz so einfach zu verstehen hätte es besser ausführen sollen. Ich meinte damit das der zeiger auf einen neuen Bereich zeigen darf, aber den bereich den er vond er Funktion zurückgegeben bekommt inhaltlich nicht verändern darf.
So hoffe jetzt Fehlerfrei und ohne Verständnissprobleme.
-
Xebov schrieb:
Ja ich weiß, meine Rechtschreibung ist grauenhaft :D.
Die Rechtschreibung ist glaube ich das kleinere Problem als die Tippfehler. In deinem letzten Post sieht es nämlich schon viel besser aus. Auf "Vorschau" klicken kann schon viel ausmachen...
Xebov schrieb:
Es ist aber nicht wiedersprüchlich
So, wie du es geschrieben hast, schon. Du hast nämlich für beide Fälle die gleiche Formulierung verwendet. :p
Aber gut, dass du es nochmals geschrieben hast, jetzt sollte es verständlich sein.
-
ah jetzt verstehe ich...hab da nicht an zeiger gedacht. Danke euch - wieder was dazugelernt...