Frage zu Code



  • Hallo,

    ich sitze gerade vor folgendem Poblem. Ich sitze gerade vor fremdem Code und versuche ihn zu verstehen. Eine Struktur macht mir ziehmliche Schwierigkeiten und zwar:

    Clause* cube( new Clause(lits, forall, clauseid) );
    

    Ich verstehe nicht was hier geschieht. Ein Pointerobject Clause namens Cube wird erschaffen. In den runden Klammern kann doch eigentlich nur die Länge stehen?

    Ein weiteres Problem habe ich mit dieser Formulierung:

    unsigned int pos(0);
    

    soll das eine unsigned int sein. Aber warum die Null? oder ein unsigned int array der Länge null?
    Da es später als Index in einem Array benutzt wird, kann es eigentlich meiner Meinung nach nur ein int sein, aber ich habe noch nie gesehen, dass eine int variable so initialisiert worden wäre.

    Für Hilfe wäre ich sehr dankbar.



  • DerLernende schrieb:

    In den runden Klammern kann doch eigentlich nur die Länge stehen?

    cube ist ein Zeiger auf einen Clause . Kein Objekt. Er zeigt auf ein Objekt. In den runden Klammern steht die Adresse, mit der der Zeiger initialisiert wird, in diesem Fall ein neues Clause -Objekt.

    DerLernende schrieb:

    Aber warum die Null? oder ein unsigned int array der Länge null?

    Das ist im Grunde das Gleiche wie eine Zuweisung. pos ist vom Typ unsigned int und hält den Wert 0.
    Der feine Unterschied ist, dass die Schreibweise oben direkt den Konstruktor des Objektes aufruft und es mit dem angegebenen Wert befüllt. Bei einer Zuweisung wurde das Objekt schon erstellt, wenn es ein const -Objekt wäre, wäre die Zuweisung illegal, während der Konstruktor das Feld noch ändern darf.

    Mit deinem cube ist es das gleiche. Der Zeiger wird mit der Adresse des von new erstellten Objektes initialisiert.



  • Super. Vielen Dank.



  • DerGelernte schrieb:

    Der feine Unterschied ist, dass die Schreibweise oben direkt den Konstruktor des Objektes aufruft und es mit dem angegebenen Wert befüllt. Bei einer Zuweisung wurde das Objekt schon erstellt, wenn es ein const -Objekt wäre, wäre die Zuweisung illegal, während der Konstruktor das Feld noch ändern darf.

    Das stimmt nicht ganz man kann ein const object/variable auch mit dem = initialisieren, wenn dies auch bei der deklaration passiert:

    const int t = 0;
    

  • Mod

    DerLernende schrieb:

    Clause* cube( new Clause(lits, forall, clauseid) );
    
    unsigned int pos(0);
    

    Typischer Fall von Klammerfetischismus, der leider immer mehr um sich greift.

    DerGelernte schrieb:

    DerLernende schrieb:

    In den runden Klammern kann doch eigentlich nur die Länge stehen?

    cube ist ein Zeiger auf einen Clause . Kein Objekt. Er zeigt auf ein Objekt. In den runden Klammern steht die Adresse, mit der der Zeiger initialisiert wird, in diesem Fall ein neues Clause -Objekt.

    cube ist natürlich auch ein Objekt. In C++ beschränkt sich dieser Begriff nicht nur auf Instanzen von Klassen.

    Clause* cube( new Clause(lits, forall, clauseid) );
    

    und

    Clause* cube = new Clause(lits, forall, clauseid);
    

    herhalten sich exakt gleich. Es wird ein Clause-Klassenobjekt per new erstellt. Das resultierende Ergebnis des new-Ausdrucks (ein Zeigerwert, der auf das erstellte Clause-Objekt verweist) wird zur Initialisierung der Variablen cube (ein Zeigerobjekt) benutzt.

    DerGelernte schrieb:

    DerGelernte schrieb:

    DerLernende schrieb:

    Aber warum die Null? oder ein unsigned int array der Länge null?

    Das ist im Grunde das Gleiche wie eine Zuweisung.

    Da pos ein skalares Objekt ist, ist diese Aussage nicht völlig falsch, aber im Kontext von C++ irreführend:
    In C++ wird streng zwischen einer Initialisierung und einer Zuweisung unterschieden. Die Initialisierung eines Objektes gibt diesem einen ersten (initialen) Wert, während eine Zuweisung zu einem späteren Zeitpunkt erfolgt, nachdem das Objekt bereits gelebt hat.

    DerGelernte schrieb:

    Der feine Unterschied ist, dass die Schreibweise oben direkt den Konstruktor des Objektes aufruft und es mit dem angegebenen Wert befüllt. Bei einer Zuweisung wurde das Objekt schon erstellt, wenn es ein const -Objekt wäre, wäre die Zuweisung illegal, während der Konstruktor das Feld noch ändern darf.

    Leider falsch. cube und pos sind beides skalare Typen (keine Arrays oder Klassen) und haben daher keinen Konstruktor, der aufgerufen werden könnte. Und der Verweis auf const-Objekt ignoriert den Unterschied zwischen Initialisierung und Zuweisung.
    Zwischen

    foo b;
    bar a = b; // (1) oder
    bar a = {b}; // (2) oder
    bar a(b); // (3) oder
    bar a{b}; // (4)
    

    besteht nie irgendein Unterschied, wenn nur skalare Typen auftreten.


Log in to reply