Defaultwerte für Variablen



  • Gibt es in C++ eine Möglichkeit Variablen einen Defaultwert zuzuweisen, damit man leichter sieht, ob der Variable schon ein Wert zugewießen wurde? Oder kann manVariablen wie Zeiger auf NULL setzen?

    Da dies mein erster Beitrag in diesem Forum ist: Hello World.

    Falls ihr eine Antwort für mich habt würde ich mich über eine Antwort freuen.





  • Klar gibts diese Möglichkeit.
    z.B. so:

    class MyClass
    {
    public:
        MyClass();
        ~MyClass() = default;
        
    private:
        int MyInteger = 42;
        std::shared_ptr<MySharedStuff> Stuff = nullptr;
        MySharedStuff *Stuff2 = nullptr;
    };
    


  • @Mr-Programm Welchen Wert man Variablen zuweisen kann (bzw. mit welchem Wert man sie initialisieren kann) hängt von ihrem Typ ab. Für eingebaute Typen gibt's immer die Möglichkeit irgendwas mit "Null" zu machen (also nullptr für Zeiger oder halt 0 für Integers, Floats oder enums).

    Bei anderen Typen geht das nicht unbedingt, die müssen über einen ihrer Konstruktoren initialisiert werden. Ein std::string oder std::vector hat z.B. keinen Zustand der irgendwie mit "Null" beschreibbar wäre, die können bloss "leer" sein. Und ein lock_guard hat gleich überhaupt keinen Zustand der auch nur irgendwie einem nullptr oder leerem Vector/String entsprechen würde -- ein lock_guard ist immer an eine Mutex gebunden und "besitzt" immer den "lock".


  • Mod

    Als Erweiterung dazu: Man könnte dann wieder einen zusammengesetzten Typen definieren, aus einem nicht-nullbarem Typen und einem Flag, das angibt, ob er doch NULL ist oder nicht. Das wird z.B. oft bei Kommunikation mit Datenbanken gemacht, wo es ein wichtiger Unterschied sein kann, ob ein Wert "leer" oder "ungesetzt" ist. Oder man kann anderweitig tricksen als mit zusammengesetzten Typen, z.B. mit Zeigern. Aber jedenfalls ist mein Punkt, dass das prinzipiell möglich ist.

    Das ist aber höchstwahrscheinlich nicht das was du meinst, wollte ich nur erwähnen als Ausblick. Das von dir vorgeschlagene Pattern, zu prüfen, ob ein Wert schon gesetzt wurde oder nicht, ist nämlich normalerweise eher ungewöhnlich. Das wäre Programmieren gegen Programmierfehler. Stattdessen sollte man sicher stellen, dass man lieber gar keine Programmierfehler hat, was viel einfacher wäre. Und falls man doch den Verdacht hat, gibt es recht gute Hilfswerkzeuge, die ein Programm überprüfen können, ob da versehentlich auf ungesetzte Werte zugegriffen wird.



  • @SeppJ So wie die Eingangsfrage gestellt wurde gehe ich genau null, überhaupt nix, nada davon aus.



  • @SeppJ

    Das von dir vorgeschlagene Pattern, zu prüfen, ob ein Wert schon gesetzt wurde oder nicht, ist nämlich normalerweise eher ungewöhnlich.

    Ich habe den Beitrag eher so verstanden, dass er es im Debugger sehen möchte. Oder wenn er den Wert irgendwo ausgibt.



  • @Mr-Programm
    Falls du wirklich meinst du möchtest die Variablen irgendwie so initialisieren, dass du im Programm dann

    if (variable == special_null_value) {
        ...
    

    schreiben kannst, dann mach es lieber so dass du Variablen so spät wie möglich definierst. Idealerweise erst dort wo du ihnen einen sinnvollen Wert geben kannst.

    Und natürlich stellt sich bei sowas immer die Frage ob deine "Blöcke" nicht zu gross sind. Wobei ich mit "Blöcke" jetzt einerseits Code-Blöcke (Funktionen, Scopes) meine, aber andrerseits auch Klassen (wenn es sich um Member-Variablen handelt).

    Idealerweise sollte kein Block/Ding so gross werden dass es sehr schwer ist zu sehen was wann wo wie initialisiert oder geändert wird. In der Praxis ist das zwar oft nicht so ganz einfach, aber speziell bei den Programmen die man als Anfänger so bastelt ist es meist gut machbar.