PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann const Variable ein Übergabeparameter sein?


Gast
2010-12-27, 20:45:32
Hallo, ich habe vermutlich eine blöde Frage für die Cracks hier, aber ich stehe noch am Anfang meiner C++ Erfahrungen und bin jetzt auf ein Problem gestoßen das mir einfach nicht einleuchtet. Vielleicht kann mit ja hier jemand helfen. Und zwar geht es zB um diesen Funktionsaufruf:

bool PrintDept (TPersAdministration const & PersAdmin, string const & Name);

Soweit ich das verstanden habe kann ich eine const Variable innerhalb einer Funktion nicht verändern. Welchen Sinn hat es dann sie Call by Reference aufzurufen?

CoconutKing
2010-12-27, 21:26:35
ist schneller :)

Marscel
2010-12-27, 21:27:40
Welchen Sinn hat es dann sie Call by Reference aufzurufen?

Dass du nicht das gesamte Konstrukt nochmal kopierst, sondern lediglich die Adresse übergibst (weniger Speicherverbrauch, schneller) und trotzdem nichts daran änder darfst.

In deinem Beispiel darfst du zum Beispiel nicht an der Adresse in PersAdmin und Name herumspielen, wohl aber an den Daten, die dort hinterlegt sind.

Gnafoo
2010-12-27, 21:30:52
Wenn man den Parameter als Referenz übergibt, spart man sich die Kopie. Bei größeren Objekten (z. B. längere Strings) kann das sinnvoll sein. Allerdings könnte man dann über die Referenz auch das übergebene Objekt verändern. Das const gibt dem Aufrufer die Garantie, dass genau das nicht passiert.

Also im Grunde genommen ist es nur eine Optimierung, um zu vermeiden, dass das übergebene Objekt kopiert wird. Bei kleinen Werten/Objekten (std::pair, int, double, …) lohnt sich das allerdings nicht.

pest
2010-12-27, 21:41:45
hab noch nie bemerkt das const irgendwas schneller macht.

Gast
2010-12-27, 21:50:55
Dass du nicht das gesamte Konstrukt nochmal kopierst, sondern lediglich die Adresse übergibst (weniger Speicherverbrauch, schneller) und trotzdem nichts daran änder darfst.

Okay danke, das leuchtet mir ein.


In deinem Beispiel darfst du zum Beispiel nicht an der Adresse in PersAdmin und Name herumspielen, wohl aber an den Daten, die dort hinterlegt sind.

Das leider nicht wirklich. Dh ich kann zB den String schon verändern? Und was meinst du mit Adresse, das ist doch kein Pointer oder?

Gnafoo
2010-12-27, 21:59:53
hab noch nie bemerkt das const irgendwas schneller macht.

Das const macht es auch nicht schneller, sondern die Referenz. Und das macht sich im Grunde genommen auch nur bemerkbar, wenn es sich um ein großes Objekt handelt (z. B. ein vector oder eine map mit jeder Menge Einträgen) und/oder eine Funktion die häufig aufgerufen wird.

Die Methode funktioniert übrigens auch mit Objekten, die sich nicht kopieren lassen (siehe z. B. boost::noncopyable).

del_4901
2010-12-27, 22:02:31
In deinem Beispiel darfst du zum Beispiel nicht an der Adresse in PersAdmin und Name herumspielen, wohl aber an den Daten, die dort hinterlegt sind.
Gerade das geht nicht und wird durch const garantiert! Der Compiler muesste dann einen Fehler ausgeben, wenn man es trotzdem versucht.

Marscel
2010-12-27, 22:14:46
Gerade das geht nicht und wird durch const garantiert! Der Compiler muesste dann einen Fehler ausgeben, wenn man es trotzdem versucht.
Das leider nicht wirklich. Dh ich kann zB den String schon verändern? Und was meinst du mit Adresse, das ist doch kein Pointer oder?

Habt recht. Hatte in Erinnerung, dass Referenzen nur nicht NULL sein dürfen, aber Käse. Referenzen sind schon an sich unveränderbar und mit dem const darfst du nicht am referenzierten Objekt friemeln.

Tiamat
2010-12-28, 10:05:46
Const selbst soll eigentlich nur Seiteneffekte verhindern und kann durch dadurch, dass sich die Datenstruktur nicht ändert, vom Compiler besser optimiert werden. Geb mal Const und Optimierung in Google ein, da finden sich etliche Beispiele..

SimonX
2010-12-28, 10:55:43
Const ist für den Programierer selbst wichtig. Erst durch "const" kann man nämlich sicher sein, das keine Veränderung am Objekt gemacht wird. Man kann dann auch nur Methoden des Objekts die als "const" definiert sind aufrufen.

Für die Optimierung spielt "Const" nicht wirklich eine Rolle. Der Compiler sieht auch selbst, ob etwas Const ist, oder nicht. Die Benutzung von Referenzen hingegen bringt viel für die Optimierung. Es ist viel zu leicht in C++ eben mal eine ganze Datenbank zu kopieren, oder beim Vergleichen jeden String erstmal zu kopieren um ihn dann zu vergleichen. Das sind alles typische C++ Fehler, die nicht nur Anfänger machen. Sowas sieht man leider sehr häufig.

Coda
2010-12-28, 13:47:47
Siehe auch: http://www.gotw.ca/gotw/081.htm

Aquaschaf
2010-12-28, 14:42:39
Const selbst soll eigentlich nur Seiteneffekte verhindern und kann durch dadurch, dass sich die Datenstruktur nicht ändert, vom Compiler besser optimiert werden.

Nope, für die Optimierung spielt das keine Rolle.

edit: wurde ja schon von meinen Vorpostern gut erläutert wieso.

Tiamat
2011-01-02, 16:51:37
Ok gut zu wissen

DanMan
2011-01-03, 20:28:30
Gerade das geht nicht und wird durch const garantiert! Der Compiler muesste dann einen Fehler ausgeben, wenn man es trotzdem versucht.
Rüschtüsch!

Wenns keine Konstante wäre, würde er direkt die übergebenen Daten ändern (weil Referenz und keine Kopie).