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.


Anmelden zum Antworten