wieso Konstanten mit "const" erzeugen ?



  • Hi,

    ich würde gerne wissen, wieso man Konstanten mit dem
    Schlüsselwort 'const' erzeugen soll, wenn man im
    Prinzip auch normale Variablen erzeugen kann, die man
    in seinem Quellcode eh nicht ändern lässt ?

    Wenn ich z.B. 'int i = 3' anstatt 'const int i = 3'
    schreiben würde, was macht es dann einen Unterschied,
    wenn ich den Wert in 'i' eh nicht ändern lasse ?

    Wofür das Schlüsselwort 'const' ?

    VIELEN DANK im Voraus



  • Wenn Du eine Bibliothek oder ein Programm schreibst und Dich darauf verlassen musst, dass ein Wert konstant bleibt, dann kann Dir der Compiler dabei helfen, indem er das erfolgreiche Übersetzen unterlässt, sobald jemand versucht diesen Wert zu ändern.



  • Damit vermeidet man auch Fehler so dass keiner den Wert aus Versehen ändert.



  • für mich erscheinen konstanten auch logischer.
    man denke an die zahl pi.
    die is immer konstant, egal was passiert.
    pi ist immer 3.14xxxx
    kommt halt darauf an, wie viele zahlen man nimmt.

    wiso eine konstante zahl, wie der name schon sagt, nicht auch daraus eine konstante machen? 😉



  • Auch kann der compiler mit einer konstanten variable viele lustige sachen machen, zb vorberechnen oder rausoptimieren.



  • oder denke an

    class a_class{
      const static int var = 1001;
      ...
    


  • Titel: wieso Konstanten mit "const" erzeugen ?

    weil es nur mit "const" geht. :p

    EDIT: defines sind ja nicht wirklich konstanten



  • man kann aber constanten auch verändern und der compiler ( egal welcher ) kann daran nichts ändern.

    frage an die profis:

    Wie macht man das?



  • Mit Pointern.



  • const float f=3.14;
    float	**ppf;
    *ppf = &f;
    **ppf = 5.25;
    

    Also mein Compiler meckert da, so einfach gehts nicht.



  • otze schrieb:

    Auch kann der compiler mit einer konstanten variable viele lustige sachen machen, zb vorberechnen oder rausoptimieren.

    Kann man so nicht ganz pauschal sagen. Was Du wahrscheinlich meinst, kann und macht er auch ohne const. Aliasing ist das größte Problem dabei, wo auch kein const weiterhilft.

    Das hier ist lesenswert und erklärt auch, wann das was Otze geschrieben hat, greift:
    http://www.gotw.ca/gotw/081.htm

    @electron_1: müsste dann so heißen:

    const float f=3.14;
    const float **ppf;
    *ppf = &f;
    **ppf = 5.25; /// geht net, weil der float auf den gezeigt wird konstant ist
    


  • Mit const_cast ?



  • Mal so in der Art versucht?

    const float f = 2.0f;
    ShowMessage(f);
    float *pf = const_cast<float*>(&f);
    *pf = 3.0f;
    ShowMessage(f);
    

    Allerdings musst du da höllisch aufpassen, dein Programm wird dir, wenn du nicht genau weißt, was du tust, bei einer Veränderung einer konstante mit Sicherheit eine AccessViolation ausspucken!



  • Und ich mein immer noch

    const float f = 2.0f;
    float *pf = const_cast<float*>(&f);
    *pf = 3.0f;
    

    Habs aber nich ausprobiert. Und wenn kann dir das OS nen Strich durch die Rechnung machen, wenn f in nem nur lesbaren RAM Bereich liegt.

    EDIT:
    Fast dasselbe und nur 3 sec Unterschied 😃



  • jop.

    const float f=3.14;
    const float *pcf = &f;
    float *pvf = const_cast<float*>(pcf)
    *pvf = 1.41
    

    müsste funktioniern

    /edit: argl. bin zu lahm heute.



  • Mit const sollte man aufpassen (abgesehen davon, dass man von Literalen das const nicht entfernen darf). Dieser Code ist ist kein legales C++:

    int a = 10;
    {
      const int& b = a;
      a = 5; // verboten solange b lebt!
    }
    


  • kann man überhaupt eine const reference auf eine non-const variable beziehen?



  • ja klar. macht man sogar häufig. aber ich verstehe 7H3 N4C3Rs code trotzdem nicht 🤡
    geloescht



  • Also was hier wieder fuer ne kriminelle energie zu tage kommt 🙂

    Schaut euch mal an, wo euer compiler die const und nichtconst Variablen ablegt ...

    int Testfunktion()
    {
        int test1 = 0;
        const int test2 = 5;
    
    }
    

    wenn ihr nen einigermasen vernuenftigen compiler habt, wird test2 immer an der selben speichgeradresse stehen, egal wo und wie die funktion aufgerufen wird ... und sie wird hoechstwahrscheinlich auch im constanten speicherbereich abgelegt werden ...

    bei

    const int test2 = test1;

    sieht die sache wieder etwas anders aus ...
    dort nutzt man das const wirklich nur, um vor sich selbst / vor den usern zu schuetzen ....
    wenn man bibliotheken schreibt wird man es lieben lernen, sonst klingelt eh aller 5 min das telefon wegens nachfragen ... weil fehler auftreten die man nie vorraussehen kann, da ist das const extenziell wichtig ...

    Ciao ...



  • pumuckl schrieb:

    kann man überhaupt eine const reference auf eine non-const variable beziehen?

    Strenggenommen gibt es keine const reference. Eine Referenz ist per Definition const in dem Sinne, dass sie einmal gebunden, nicht verändert werden kann. Eine Referenz-auf-const kann aber natürlich problemlos an eine nicht-konstante Variable gebunden werden.

    Eure Beispiele mit den const_casts erzeugen übrigens alle undefiniertes Verhalten und funktionieren somit nicht. Dem Compiler das Maul zu verbieten ist nicht äquivalent zu "funktioniert".

    7H3 N4C3R schrieb:

    Dieser Code ist ist kein legales C++:

    int a = 10;
    {
      const int& b = a;
      a = 5; // verboten solange b lebt!
    }
    

    Das wäre mir neu. Chapter und Verse, bitte.

    Imo ist das einfach nur ein typisches Beispiel für aliasing und zeigt den Unterschied zwischen einer Referenz-auf-const und einer Konstanten. Ersteres heißt nur, dass du über die Referenz (oder den Zeiger) das referenzierte Objekt nicht ändern darfst. Es heißt aber nicht, dass sich das referenzierte Objekt garantiert nicht ändert.



  • 7H3 N4C3R schrieb:

    otze schrieb:

    Auch kann der compiler mit einer konstanten variable viele lustige sachen machen, zb vorberechnen oder rausoptimieren.

    Kann man so nicht ganz pauschal sagen. Was Du wahrscheinlich meinst, kann und macht er auch ohne const. Aliasing ist das größte Problem dabei, wo auch kein const weiterhilft.

    nur mit const kann der compiler es einfacher machen, zumindest bei pod typen, denn da sieht er, dass die ganze variable nicht mehr geändert werden _kann_(zb durch mutable/volatile), und kann viel einfacher damit arbeiten


Anmelden zum Antworten