C
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.