C++ Costruttori

Da Andreabont's Wiki.

In C++ gli oggetti (e per estensione anche i tipi base) vengono inizializzati attraverso i costruttori:

Tipi di costruttori

Poniamo questa classe di esempio:

class Test { 
public:

    Test() {
        std::cout << "Costruttore standard... " << std::endl; 
    }

    Test(const Test &t) { 
       std::cout << "Costruttore di copia... " << std::endl; 
    }

    Test(std::initializer_list<int> list) {
        std::cout << "Costruttore per lista di inizializzazione... " << std::endl; 
    }

};

Costruttore standard

Questo costruttore viene chiamato quando si crea un oggetto normalmente.

Test a;
Test a(...); // Se il costruttore accetta parametri


Costruttore di copia

Questo costruttore viene chiamato quando si crea un oggetto partendo da un'altro.

Test b(a);
Test b = a;

Costruttore per lista di inizializzazione

Questo costruttore viene chiamato quando si passa una lista di elementi tramite apposita sintassi.

Test c{1, 2, 3};
Test c = {1, 2, 3};

Usi particolari

Designated Initializers

Dal C++20 è possibile inizializzare gli attributi pubblici attraverso una sintassi simile alla lista di inizializzazione.

struct A {
    int x;
    int y;
    int z;
};

int main() {

   A b{.x = 3, .z = 2}; // Valore di y è 0
   A c{.z = 2, .x = 3}; // NO! Va rispettato l'ordine di dichiarazione

}

Member Initializer List

Dal C++11 è possibile definire l'inizializzazione degli attributi con una sintassi dedicata per il costruttore.

class Foo {

private:
    int m;

public:
    Foo() : m(42) {}

};

Delegate Constructor

Dal C++11 è possibile definire dei costruttori che eseguano un binding verso altri costruttori in overload.

class Foo {

public:
    Foo(char x, int y) {}
    Foo(int y) : Foo('a', y) {} // Delego al primo costruttore con binding.

};