Výchozí konstruktor

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

C++

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ě:

  • Když je objekt deklarován bez argumentů (například MyClass x;) nebo je v paměti vytvořena nová instance (například new MyClass;nebo new MyClass();).
  • Když je deklarováno pole objektů, jako je MyClass x[10];; nebo deklarován dynamicky, například new MyClass [10]. Výchozí konstruktor inicializuje všechny členy.
  • Když podřízená třída explicitně neurčuje konstruktor nadřazené třídy v inicializačním seznamu.
  • Když konstruktor třídy explicitně nevolá konstruktor alespoň jednoho ze svých polí objektu v inicializačním seznamu.
  • Ve standardní knihovně některé kontejnery vyplní své hodnoty pomocí výchozích konstruktorů, pokud hodnota není explicitně zadána. Například vector<MyClass>(10);vyplní vektor deseti prvky inicializovanými výchozím konstruktorem.

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 };

Java

class DefaultConstructor { int a = 10 ; public int getInt () { vrátit a ; } } třída Hlavní { public static void main ( String [] args ) { DefaultConstructor Dc = new DefaultConstructor (); //Výchozí konstruktor System . ven . println ( Dc . getInt () ); } } // Špatně!

Poznámky

  1. Standard C++, ISO/IEC 14882:1998, 12.1.5
    Standard C++, ISO/IEC 14882:2003, 12.1.5
  2. 1 2 Počítačová věda Strukturovaný přístup využívající C++ Behrouz A. Forouzan a Richard F. Gilberg