new mit Klammern? Warum?



  • Hallo Forum,

    warum sollte es besser so heißen:

    ClassX *x = new ClassX;
    ClassX xx = new ClassX();
    

    Als so:

    ClassX *x = new ClassX();
    ClassX xx = new ClassX;
    

    Wenn man einen Pointer mit new befüllt sollen die Klammern weggelassen werden und wenn es eine die Variable direkt ist sollen die Klammern hin. Wieso?

    Vielen Dank

    Tim



  • Bist Du sicher, daß die Versionen alle compiliert werden?



  • ... schrieb:

    warum sollte es besser so heißen:

    ClassX *x = new ClassX;
    ClassX xx = new ClassX();
    

    Als so:

    ClassX *x = new ClassX();
    ClassX xx = new ClassX;
    

    Wenn man einen Pointer mit new befüllt sollen die Klammern weggelassen werden und wenn es eine die Variable direkt ist sollen die Klammern hin. Wieso?

    Wo hast du das denn her? Bist du sicher dass du im richtigen Forum bist? Das ist zum Teil kein C++ sondern sieht eher nach Java oder ähnlichem aus.

    ClassX *x = new ClassX; //OK
    ClassX *x = new ClassX(); //geht auch.
    
    ClassX xx = new ClassX(); //FEHLER: new ClassX(); liefert einen Pointer,der nicht zugewiesen werden kann.
    ClassX xx = new ClassX; //FEHLER, siehe oben.
    

    normale Objekte werden ohne new erzeugt:

    ClassX xx; //OK
    ClassX xx(); //FEHLER: der Compiler interpretiert das als Funktionsdeklaration.
    


  • Ich gehe gerade einen Foliensatz durch wo C++ mit Java verglichen wird. Ihr habt Recht, die jeweils zweite Zeile ist aus Java, ohne das ich es gemerkt habe.

    Bleibt noch die Frage warum ich bei new die Klammern weglassen sollte? (Beispiel in der ersten Zeile.)



  • ... schrieb:

    Bleibt noch die Frage warum ich bei new die Klammern weglassen sollte? (Beispiel in der ersten Zeile.)

    Ich sehe da keinen besonderen Grund für. Wird in deinem Script nichts dazu gesagt? Es compiliert beides und macht auch das selbe. Das einzige was ich mir vorstelln könnte ist die Parallele zur normalen Objekterzegung auf dem Stack, wo bei default-konstruierten Objekten die Klammern weggelassen werden müssen, eben weil der Compiler das als Funktionsdeklaration parst. Das deswegen auch bei dynamischer Allokation zu machen halte ich bestenfalls für fragwürdig.



  • Stimmt Pumuckl, das war es! Ich kann mich schwach erinnern (Vorlesung) das es mit der Funktionsdeklaration zusammenhing. Vielen Dank für die Erinnerung 🙂



  • Für lokale Variablen hat pumuckl ja schon geschrieben, daß nur die Version ohne Klammern funktioniert (da es sonst als Funktionsdeklaration angesehen wird).

    Und für die Verwendung von new:
    Bei Klassen ist es egal, da immer der Default-Konstruktor aufgerufen wird.
    Bei PODs wird mit Klammern der Wert mit Null initialisiert, z.B.

    int *x = new int;
    std::cout << *x; // irgendwein Wert (was eben gerade so im Speicher liegt -)
    
    int *y = new int();
    std::cout << *y; // hier sollte jetzt immer 0 ausgegeben werden!
    

    Gerade bei allgemeiner Template-Programmierung sollte man das beachten, d.h.

    template<typename T> void Test()
    {
      T *t = new T();
    
      std::cout << *t;
    
      // ...
    }
    

    Nachtrag:
    auch für lokale Variablen kann man das "mit Null initialisieren" erzwingen:

    int x = int(); // da "int x()" ja anders interpretiert wird
    
    //bzw. in templates
    T t = T();
    


  • Das die PODs dabei auf 0 gesetzt werden wußre ich nicht. Vielen Dank


Anmelden zum Antworten