Variablen initialisieren
-
Worin liegt der Unterschied zwischen:
SomeType t = u;und
SomeType t; t = u;Außer, dass das zweite mehr Schreibarbeit ist. Wird bei Beiden zunächst der Default Konstruktor aufgerufen?
Gruß
Fritz
-
Das erste nennt sich Copy Initialization und ruft direkt den Kopierkonstruktor auf. Das zweite ruft erst den Default-Konstruktor auf und dann den Assignment-Operator.
Für das erste muss lediglich Kopiersemantik zur Verfügung stehen (Default-Ctor und Assignment-Op), auch wenn diese nicht benutzt wird, sonst gibt es einen Compile-Error. Allerdings setzen das die wenigsten Compiler tatsächlich um.
-
LordJaxom schrieb:
Das erste nennt sich Copy Initialization und ruft direkt den Kopierkonstruktor auf. Das zweite ruft erst den Default-Konstruktor auf und dann den Assignment-Operator.
Guter Anfang!
LordJaxom schrieb:
Für das erste muss lediglich Kopiersemantik zur Verfügung stehen (Default-Ctor und Assignment-Op), auch wenn diese nicht benutzt wird, sonst gibt es einen Compile-Error. Allerdings setzen das die wenigsten Compiler tatsächlich um.
Bitte was? Für copy-initialization braucht man keinen default-ctor und auch keinen assignment-op.
-
krümelkacker schrieb:
LordJaxom schrieb:
Für das erste muss lediglich Kopiersemantik zur Verfügung stehen (Default-Ctor und Assignment-Op), auch wenn diese nicht benutzt wird, sonst gibt es einen Compile-Error. Allerdings setzen das die wenigsten Compiler tatsächlich um.
Bitte was? Für copy-initialization braucht man keinen default-ctor und auch keinen assignment-op.
Stimmt, hier habe ich etwas durcheinandergebracht.
Wenn u vom Typ SomeType ist, hast Du vollkommen recht.
Wenn aber u von einem anderen Typ ist, und ein Konstruktor SomeType(decltype(u)) zur Verfügung steht, muss in SomeType ein Copy-Constructor zur Verfügung stehen, auch wenn der nicht aufgerufen wird.
Einen weiteren Unterschied gibt es noch: Copy-Initialization funktioniert nicht, wenn der Konstruktor explicit ist.