PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Wieviel "const" ist gut?



BLUESCREEN3D
30-07-2007, 13:57
Man kann ja Variablen öfter als const deklarieren, als man denkt. Aber ist es empfehlenswert, alles auf const zu setzen, was geht?

Beispiel 1:
Daten aus Datenbank, die man nicht ändern, sondern nur weiterverarbeiten will.

const int value = get_value();

Beispiel 2:
Funktionsparameter, die nicht geändert werden.

unsigned int square(const int value)
{
return value * value;
}

Beispiel 3:
Exceptions.

catch (const exception &e)

Beispiel 4:
Ein Zeiger bei dem man weder den Zeiger selbst noch den Inhalt ändert.

const some_class * const ptr = ...
Wird langsam unübersichtlich :D

Kurz: Soviel const wie möglich oder so wenig wie nötig?

Krenox
31-07-2007, 11:37
Also ich würde sagen soviel wie sinnvoll ist.

peschmae
31-07-2007, 21:27
Wie ich das machen würde: Nein, Ja, Nein, Nein

Begründungen:
1) Ein Schlüsselwort mehr, aber was bringts? Den Inhalt kriegst du erst zur Laufzeit, braucht also trotzdem Speicher. Wenn du nichts besonderes damit machst anschliessend kann der Compiler wohl auch in den meisten Fällen nicht mehr optimieren wenn du da jetzt noch const hinschreibst.

2) Sonst kannst du keine const übergeben. Mit const aber beides. Ausserdem gibst du damit dem Aufrufer Informationen die nützlich sein können.

3) Naja, ich programmierte früher mal Java, da schreibt man das auch nie (könnte man? Egal)... :D

4) Ich weiss nie welches welches ist, müsste das also nachschauen gehen. Im Normalfall setze ich da keines; sonst nur wenn ich damit was konkret erreichen will (dass der Inhalt oder der Pointer const ist halt; aber das ist selten.)

Aber mal schaun was die anderen meinen. PANCPPG (*)

MfG Peschmä

(*) Peschmä Aint No C++ Guru

jan61
31-07-2007, 21:44
Man kann ja Variablen öfter als const deklarieren, als man denkt. Aber ist es empfehlenswert, alles auf const zu setzen, was geht?
...

Meiner Meinung nach immer dann, wenn man sicherstellen will, dass der entsprechende Wert anschließend nicht mehr geändert wird. Das Schlüsselwort (ja, auch in Java ;-) gibt dem Compiler den Wink mit dem Zaunpfahl, ein wachsames Auge darauf zu haben. Er wird das regelmäßig auch anmosern.

Jan

anda_skoa
01-08-2007, 14:34
Const bei Variablen hat manchmal den Vorteil, dass man Fehler findet, die leider auf Grund der int/bool Dualität gültiger Syntax sind.

zB



if (x = 5) // wenn man ansich x == 5 machen wollte.

Wenn x da ein const int ist, gibt es einen Compilerfehler. Es gibt glaub ich auch sonst je nach Compiler ein Warning, aber Warnings werden manchmal "übersehen" :)

Ciao,
_

BLUESCREEN3D
01-08-2007, 20:47
2) Sonst kannst du keine const übergeben. Mit const aber beides.
Nein, das kann man auch so.
Aber falls die Funktion eine Referenz erwartet, ist es so, wie du sagst.

Das ist übrigens auch ein Anwendungsfall, wo ich das setzen von const für sinnvoll halte:
Wenn man eine Referenz nutzt, um für Lesezugriffe einen langen Zugriffspfad abzukürzen und damit dann zwei Namen für die selben Daten hat, sollte man vllt. const nutzen, um nicht aus Versehen über die Referenz die Daten zu ändern:

const anything &ref = here->there.these[that[i + j * k + offset]];


4) Ich weiss nie welches welches ist, müsste das also nachschauen gehen. Im Normalfall setze ich da keines; sonst nur wenn ich damit was konkret erreichen will (dass der Inhalt oder der Pointer const ist halt; aber das ist selten.)
Das erste "const" bezieht sich auf den Inhalt - kann man sich gut über die bekannten "const char *" merken.


Meiner Meinung nach immer dann, wenn man sicherstellen will, dass der entsprechende Wert anschließend nicht mehr geändert wird.
Natürlich, das ist ja der Sinn von const.
Aber es ging ja darum, in welchen Fällen man es nutzen sollte, obwohl es eigentlich nicht nötig wäre.

peschmae
02-08-2007, 19:31
Wenn x da ein const int ist, gibt es einen Compilerfehler. Es gibt glaub ich auch sonst je nach Compiler ein Warning, aber Warnings werden manchmal "übersehen" :)


Ein Klassiker. Schon viel gesehen. Nur habe ich das noch nie selber geschafft. :D

Vielleicht hab ich aber auch die Bugs einfach immer konsequent übersehen ;)


Nein, das kann man auch so.
Aber falls die Funktion eine Referenz erwartet, ist es so, wie du sagst.


*pfeif und in die Luft guck* - wir verstehen uns ja :D



Natürlich, das ist ja der Sinn von const.
Aber es ging ja darum, in welchen Fällen man es nutzen sollte, obwohl es eigentlich nicht nötig wäre.

Naja, nötig ist es ja nie. (Mal schauen ob ich mich jetzt da zu weit aus dem Fenster gelehnt habe... ;))

MfG Peschmä