Výchozí konstruktor v objektově orientovaných programovacích jazycích je konstruktor , který lze volat bez argumentů .
Pokud v C++ a Javě nejsou ve třídě žádné explicitně definované konstruktory , pak kompilátor používá implicitně definovaný výchozí konstruktor a je to obvykle nulový konstruktor. Pokud programátor explicitně zadal pouze konstruktor s parametry, pak kompilátor nevytvoří výchozí konstruktor.
Pokud v C++ a Javě odvozená třída explicitně nevolá konstruktor základní třídy (v C++ v inicializačním seznamu, v Javě super()na prvním řádku), pak se výchozí konstruktor volá implicitně.
V C++ standard popisuje výchozí konstruktor jako konstruktor, který lze volat bez předávání argumentů (včetně konstruktoru s parametry, které mají výchozí hodnotu). [1] Například:
třída MyClass { veřejnost : Moje třída (); // je deklarován konstruktor soukromé : int x ; }; MyClass :: MyClass () : x ( 100 ) // konstruktor definovaný { } int main () { MojeTřída m ; // za běhu programu se vytvoří objekt m A výchozí konstruktor se nazývá }Když je paměť dynamicky alokována pro objekt, konstruktor lze volat přidáním prázdných závorek za název třídy. V jistém smyslu se jedná o explicitní volání konstruktoru:
int main () { MyClass * ukazatel = new MyClass (); // za běhu se vytvoří objekt a // se zavolá výchozí konstruktor }Pokud má konstruktor jeden nebo více výchozích parametrů, je to stále výchozí konstruktor. Každá třída může mít maximálně jeden výchozí konstruktor, buď bez parametrů, nebo s výchozími parametry, jako v tomto příkladu:
třída MyClass { veřejnost : MyClass ( int i = 0 , std :: string s = "" ); // konstruktor je deklarován (prototyp) soukromé : int x ; int y ; std :: stringz ; _ }; MyClass :: MyClass ( int i , std :: string s ) // konstruktor definovaný { x = 100 ; y = i ; z = s ; }V C++ jsou výchozí konstruktory zásadní, protože jsou za určitých okolností volány automaticky, a proto za určitých podmínek musí mít třída výchozí konstruktor, jinak dojde k chybě:
Pokud třída nedefinuje výchozí konstruktor, kompilátor jej implicitně vytvoří. Bude to stejné jako explicitně deklarovaný konstruktor s prázdným tělem. Například: [2]
třída MyClass { int x ; }; int main () { MojeTřída m ; // při běhu programu není žádná chyba, implicitní konstruktor se nazývá }Pokud jsou pro třídu definovány konstruktory, ale není mezi nimi žádný výchozí konstruktor, kompilátor jej implicitně nevygeneruje. Výsledkem jsou chyby, jako je tento příklad:
třída MyClass { veřejnost : MyClass ( int y ); // nevýchozí deklarace konstruktoru soukromé : int x ; }; MyClass :: MyClass ( int y ) { x = y _ } int main () { MyClass m ( 100 ); // nevýchozí konstruktor s názvem MyClass * p ; // kompilátor nemusí vědět o konstruktorech, když deklaruje ukazatel p = new MyClass (); // chyba při kompilaci: žádný výchozí konstruktor return 0 ; }Vytvoření objektu, na který ukazuje p, také způsobí chybu. [2]
Na druhou stranu v C++ 11 může být výchozí konstruktor explicitně specifikován:
třída MyClass { veřejnost : MyClass () = výchozí ; // vynucení generování výchozího konstruktoru };Nebo explicitně odstraněno:
třída MyClass { veřejnost : MyClass () = delete ; // zabrání generování výchozího konstruktoru };