Wieso "const" verwenden?
-
enums sind nicht gut geeignet, weil z.B. DAME + ATOUTBONUS den Wertebereich des Aufzählungstyps verlassen würde, überhaupt lässt sich mit enum-Konstanten nicht sonderlich gut rechnen.
enum Rang{VII =7, VIII = 8, IX = 9}; Rang meinRang = (Ergebnis irgend einer Berechnung); /* Fehler! Selbst wenn der Wert im zulaessigen Bereich liegen wuerde. */ Rang meinRang2 = meinRang + 2; /* Fehler! -> enum ist unbequem und unflexibel */
-> enum nur dann, wenn auch hundertprozentig niemals damit gerechnet wird. Das ist aber oft schwer vorherzusehen. Deshalb lieber #define oder const, damit lässt sich später bestimmt problemlos rechnen.
-
unerfahren3 schrieb:
enums sind nicht gut geeignet, weil z.B. DAME + ATOUTBONUS den Wertebereich des Aufzählungstyps verlassen würde
Nein, tut es nicht. Aber es stimmt, allgemein sind enums nicht für Addition o.ä. vorgesehen. In diesem Fall ist eine Addition aber eher nicht angebracht, es wäre wohl sinnvoller, Flags zu verwenden und diese zu verodern.
-
drakon schrieb:
globals-freak schrieb:
Jester schrieb:
...also eigentlich nur bei globalen Konstanten.
das ist auch der einzige fall, bei dem ich 'const' verwende.
Naja und da ich mal annehem, dass du keine 100 MB an Speicher drinn hast, wird es kaum merkbar sein, dass da Speicher gespart wird.
doch, letztens erst ein paar webseiten + code mussten in 256K flash passen. der RAM war nur 64K gross. da hat 'const' echt was geholfen. aber eigentlich ziehe ich #pragmas oder irgendwelche linkereinstellungen vor, um objekte an bestimmte speicherbereiche festzunageln.
-
webdesign-freak schrieb:
drakon schrieb:
globals-freak schrieb:
Jester schrieb:
...also eigentlich nur bei globalen Konstanten.
das ist auch der einzige fall, bei dem ich 'const' verwende.
Naja und da ich mal annehem, dass du keine 100 MB an Speicher drinn hast, wird es kaum merkbar sein, dass da Speicher gespart wird.
doch, letztens erst ein paar webseiten + code mussten in 256K flash passen. der RAM war nur 64K gross. da hat 'const' echt was geholfen. aber eigentlich ziehe ich #pragmas oder irgendwelche linkereinstellungen vor, um objekte an bestimmte speicherbereiche festzunageln.
Ok. Ich habe in "PC- Dimensionen" gedacht.
-
Simon2 schrieb:
KasF schrieb:
Ich find ein const sieht einfach schööön aus
const int SIZE = 10; void func( const Muap& obj ); int getMem() const;
Und ich finde, es sieht noch schöner aus, wenn man die const-Position konsistent hält:
int const SIZE = 10; void func( Muap const& obj ); int getMem() const;
Gruß,
Simon2.
ich finds eigentlich ganz praktisch, wenn man sofort das "const" sieht. Aber ich seh letztens oefters "Foo const& foo" anstatt "const Foo& foo"... wie kommts?
-
Blue-Tiger schrieb:
ich finds eigentlich ganz praktisch, wenn man sofort das "const" sieht. Aber ich seh letztens oefters "Foo const& foo" anstatt "const Foo& foo"... wie kommts?
Hat Simon doch geschrieben: Weil's so konsistent ist. Bei 'const'-Methoden ist das 'const' halt zwangsläufig postfix, daher bietet es sich an, dass es auch bei anderen Deklarationen postfix gestellt wird.
-
Konrad Rudolph schrieb:
Blue-Tiger schrieb:
ich finds eigentlich ganz praktisch, wenn man sofort das "const" sieht. Aber ich seh letztens oefters "Foo const& foo" anstatt "const Foo& foo"... wie kommts?
Hat Simon doch geschrieben: Weil's so konsistent ist. Bei 'const'-Methoden ist das 'const' halt zwangsläufig postfix, daher bietet es sich an, dass es auch bei anderen Deklarationen postfix gestellt wird.
es ist bei den const-Methoden ja eigentlich nur ein layouttechnischer "Hack", weil der this-Zeiger implizit uebergeben wird. Aus Konsitenzgruenden ueber all das const am Ende zu schreiben find ich da etwas merkwuerdig o_0 Ist das echt der einzige Grund?
-
Beim Programmieren ist vieles ein – wie nanntest Du's? – layouttechnischer Hack. Es geht schließlich darum, das ganze lesbar zu machen.
Da die beiden Varianten ansonsten gleichwertig sind, ist das u.a. für mich Grund genug.
-
pumuckl schrieb:
Bashar schrieb:
Nachteile von const:
http://c2.com/cgi/wiki?AvoidConstCompletelyWenn man sich das mal genauer anschaut kommen dort zu jedem Nachteil, den const angeblich hat (schwarze Punkte), mehrere Gegenargumente (weisse Punkte)...
Und wenn man es noch genauer anschaut, sieht man, dass das nicht so ist
Die weißen Punkte sind auch manchmal keine Gegenargumente, manchmal fehlen Gegenargumente oder beziehen sich nur auf eingeschränkte Aspekte. Wenn man const benutzt, muss man sich darüber im klaren sein, dass sich das durch das ganze Programm zieht (=> ConstIsAVirus), weil man auf einem const-Objekt nur const-Methoden aufrufen kann. Das führt dann irgendwann zu solchen Abscheulichkeiten wie const_iterator, also Codeduplikation. Wenn man da mal den Gewinn gegenrechnet, sieht das gar nicht mehr so gut aus für const.
-
Blue-Tiger schrieb:
Aber ich seh letztens oefters "Foo const& foo" anstatt "const Foo& foo"... wie kommts?
Die Schreibweise ist unter anderem von dem Versuch const bei Zeigern zu erklären, und einen konsistenten Stil zu finden hergekommen. Bei den folgenden Schreibweisen hat man den Vorteil direkt ablesen zu können was const ist (von rechts nach links):
Foo const & value; // Foo ist konstant Foo const * value; // Foo ist konstant Foo * const value; // Zeiger ist konstant
Es ist also eine reine Vereinfachung wenn man sich den mal daran gewöhnt hat.
Bashar schrieb:
Wenn man da mal den Gewinn gegenrechnet, sieht das gar nicht mehr so gut aus für const.
Ich sehe den Gewinn den man durch const hat weiter als schwerwiegender als die Nachteile an. Und sei es nur das man den Code direkt ansieht was gemeint ist. Wie heißt es so treffend:
Code wird häufiger gelesen, als geschrieben
Alleine schon die Lesbarkeit ist für mich DAS Argument schlechthin. Ganz zu schweigen das der Compiler dann auch die Möglichkeit hat mich dann auf eine falsche Bedienung hinzuweist. Mir ist es definitiv lieber wenn ich mir nur die Deklaration anschauen muss um zu wissen ob etwas manipuliert wird oder nicht. Ich möchte nicht erst die Implementierung analysieren müssen um festzustellen ob ich an einer Stelle eine Kopie übergeben muss, oder das Original übergeben kann, wenn ich keine Änderung erwarte.
cu André
-
Blue-Tiger schrieb:
Konrad Rudolph schrieb:
Blue-Tiger schrieb:
ich finds eigentlich ganz praktisch, wenn man sofort das "const" sieht. Aber ich seh letztens oefters "Foo const& foo" anstatt "const Foo& foo"... wie kommts?
Hat Simon doch geschrieben: Weil's so konsistent ist. Bei 'const'-Methoden ist das 'const' halt zwangsläufig postfix, daher bietet es sich an, dass es auch bei anderen Deklarationen postfix gestellt wird.
es ist bei den const-Methoden ja eigentlich nur ein layouttechnischer "Hack", weil der this-Zeiger implizit uebergeben wird. Aus Konsitenzgruenden ueber all das const am Ende zu schreiben find ich da etwas merkwuerdig o_0 Ist das echt der einzige Grund?
Ja, weil es nicht nur um Methoden geht, sondern auch bzw. eher um Zeiger:
int * const p = ...; // const steht auch hier rechts von dem auf was es wirkt int * const * p2 = ...; // und hier auch int const* p3 = ...; // wenn man es so schreibt auch const int* p4 = ...; // wenn man es so schreibt allerdings nicht
Nochmal zu...
Aus Konsitenzgruenden (...) Ist das echt der einzige Grund?
Ja.
Es ist IMO einfacher Code zu lesen wo const immer an der gleichen Stelle steht, statt Code wo const mal da mal da steht. Also legt man es fest. Und da es eben ein paar Stellen gibt wo const nur rechts stehen kann macht es doch nur Sinn es auch bei "const T"/"const T&" vs. "T const"/"T const&" auf rechts festzulegen.Stilistische Freiheit ist überbewertet, und zwar enorm.
-
möp??
also ist int const besser als const int? oder gilt das eben nur für methoden?
sry wenn das schon geklärt wurde, ich habe mir das nicht alles hier durchgelesen.
-
unerfahren3 schrieb:
Welche Variante findet ihr 'stilistisch schöner':
Für mich gibts nur die erste Variante, die zweite ist schon disqualifiziert bevor ich's mir ganz angeschaut habe
Zu pre/post-const: Mir gefällt das post-const überhaupt nicht. Ist eben Geschmackssache, aber vllt ändert sich das ja noch
-
hustbaer schrieb:
Es ist IMO einfacher Code zu lesen wo const immer an der gleichen Stelle steht, statt Code wo const mal da mal da steht. Also legt man es fest. Und da es eben ein paar Stellen gibt wo const nur rechts stehen kann macht es doch nur Sinn es auch bei "const T"/"const T&" vs. "T const"/"T const&" auf rechts festzulegen.
Stilistische Freiheit ist überbewertet, und zwar enorm.
Jo, eure Argumente leuchten so langsam aus. Allerdings hab ich diese Schreibweise zum Ersten mal vor ein paar Wochen hier im Forum gesehn. Jeglicher Quellcode, den ich sonst les (Buecher, Blogs, hier im Forum, Open-Source-Programme, etc.) schreibt "const int" statt "int const". Die Schreibweise ist also nicht so verbreitet hab ich den Eindruck, deswegen wunderts mich. Hab ich das noch nie mitgekriegt und les nur immer die falschen Buecher (IIRC benutzen Stroustrup, Meyers, GOTW und die Gang Of 4 alle "const int") oder ist diese Schreibweise doch relativ untypisch? (denn wie du sagst, Stilistische Freiheit sollte nicht auf Kosten der Lesbarkeit gehen... und "gewohnter" Code ist nunmal lesbarer, IMO).
-
Also Stroustrup weisst auf die Möglichkeit hin, sagt aber dann auch, dass es Geschmackssache ist. Weiss aber nicht mehr, was er bevorzugt.
-
asc schrieb:
Ich sehe den Gewinn den man durch const hat weiter als schwerwiegender als die Nachteile an. Und sei es nur das man den Code direkt ansieht was gemeint ist. Wie heißt es so treffend:
Code wird häufiger gelesen, als geschrieben
Alleine schon die Lesbarkeit ist für mich DAS Argument schlechthin.
das mit der lesbarkeit geht noch besser, mit ein paar #defines ins 'nichts'
#define IN #define OUT #define INOUT ... void MachWas ( IN int *a, // daten werden nur gelesen (bedeutet etwa 'const') OUT int *b, // daten werden nur geschrieben INOUT int *c, // daten werden gelesen und geschrieben ) { ... }
das finde ich sehr aussagekräftig und man hat keine 'const'-nervereien.
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
-
drakon schrieb:
Also Stroustrup weisst auf die Möglichkeit hin, sagt aber dann auch, dass es Geschmackssache ist.
so zieht er sich öfter aus der affäre. wenn er ehrlich wäre, würde er sagen: 'sorry leute, aber ich habe da ganz grossen mist gebaut!'
-
lesbarkeits-freak schrieb:
#define IN #define OUT #define INOUT ... void MachWas ( IN int *a, // daten werden nur gelesen (bedeutet etwa 'const') OUT int *b, // daten werden nur geschrieben INOUT int *c, // daten werden gelesen und geschrieben ) { ... }
das finde ich sehr aussagekräftig und man hat keine 'const'-nervereien.
Und der Compiler hilft dir nicht, deine Versprechen umzusetzen (nämlich const Variablen auch wirklich const zu lassen)
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
Wenn wild hin- und hergecastet werden muss und/oder die selbe Verison einer Methode mal in const und mal in nicht-const geschrieben werden muss, liegt das meist daran, dass jemand nicht durchgehend const-correct war oder ein designfehler vorliegt.
Ja, const ist ein Virus - aber einer von dem man recht wenig mitbekommen sollte wenn man durchgehend const-correct schreibt und nicht irgendwo das const aus Faulheit oder Gedankenlosigkeit weglässt. const und seine Auswirkungen immer im Hinterkopf zu behalten hilft, sichereren Code zu schreiben.
-
lesbarkeits-freak schrieb:
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
Habe da genau umgekehrte Erfahrungen. Riesige Mengen Code, wichtige Projekte, viel const, kein Gecaste, keine Probleme.
Weiss aber nicht mehr, was er bevorzugt.
Was er bevorzugt hat nicht mehr Gewicht als das was mein Hund bevorzugt (solange mehr möglich ist). Und ich habe nicht einmal einen.
-
lesbarkeits-freak schrieb:
das mit der lesbarkeit geht noch besser, mit ein paar #defines ins 'nichts'
Nein, das ist die Katastrophe schlechthin, denn hier verlässt man sich als Leser darauf, dass diese Versprechen auch eingehalten werden, aber der Compiler weiß nichts davon und kann das deswegen nicht garantieren. 'const' wird vom Compiler wenigstens im Ansatz geprüft.
übrigens, ich hab' noch nie 'nen grösseren quelltext gesehen, der 'const' ausgiebig verwendet und bei dem deswegen nicht wild hin- und hergecastet, oder duplikate gebraucht werden (eine 'const' und eine nicht-'const' version).
Mir geht es wie Fellhuhn: Ich habe genau umgekehrte Erfahrungen.
Nochmal zu Stroustrup: Er bevorzugte, wenn ich mich richtig erinnere, die Präfix-Variante von 'const' und hat mich dadurch überzeugt, die Postfix-Variante zu verwenden (nicht, um ihm zu widersprechen, sondern weil er zugab, dass es eigentlich keinen Grund für die Präfix-Variante gibt, sehr wohl aber Argumente für die andere).