Az alapértelmezett konstruktor az objektumorientált programozási nyelvekben egy olyan konstruktor , amely argumentumok nélkül hívható meg .
A C++ és Java nyelven , ha nincsenek explicit módon definiált konstruktorok egy osztályban , akkor a fordító az implicit módon definiált alapértelmezett konstruktort használja, és általában egy null konstruktor. Ha a programozó kifejezetten csak egy konstruktort adott meg paraméterekkel, akkor a fordító nem hoz létre alapértelmezett konstruktort.
Ha C++-ban és Java-ban a származtatott osztály nem hívja meg kifejezetten az alaposztály-konstruktort (C++-ban az inicializálási listában, Java super()-ban az első sorban), akkor az alapértelmezett konstruktort implicit módon hívja meg.
A C++ nyelvben a szabvány az alapértelmezett konstruktort olyan konstruktorként írja le, amely argumentumok átadása nélkül hívható meg (beleértve az alapértelmezett értékkel rendelkező paraméterekkel rendelkező konstruktort is). [1] Például:
osztály MyClass { nyilvános : Saját osztály (); // konstruktor deklarálva van privát : int x ; }; MyClass :: MyClass () : x ( 100 ) // konstruktor definiált { } int main () { MyClass m ; // a program futása közben létrejön egy m objektum ÉS az alapértelmezett konstruktor a }Ha egy objektum számára dinamikusan van lefoglalva memória, a konstruktor az osztálynév után üres zárójelek hozzáadásával hívható meg. Bizonyos értelemben ez egy kifejezett konstruktor hívás:
int main () { MyClass * pointer = new MyClass (); // futásidőben létrejön az objektum és // az alapértelmezett konstruktor meghívásra kerül }Ha egy konstruktor egy vagy több alapértelmezett paraméterrel rendelkezik, továbbra is az alapértelmezett konstruktor. Minden osztálynak legfeljebb egy alapértelmezett konstruktora lehet, akár paraméterek nélkül, akár alapértelmezett paraméterekkel, mint ebben a példában:
osztály MyClass { nyilvános : MyClass ( int i = 0 , std :: string s = "" ); // a konstruktor deklarálva van (prototípus) privát : int x ; int y ; std :: stringz ; _ }; MyClass :: MyClass ( int i , std :: string s ) // konstruktor definiált { x = 100 ; y = i ; z = s ; }A C++-ban az alapértelmezett konstruktorok elengedhetetlenek, mert bizonyos körülmények között automatikusan meghívódnak, ezért bizonyos feltételek mellett az osztálynak alapértelmezett konstruktorral kell rendelkeznie, különben hiba történik:
Ha egy osztály nem határoz meg alapértelmezett konstruktort, a fordító implicit módon létrehoz egyet. Ez ugyanaz lesz, mint egy kifejezetten deklarált konstruktor üres törzstel. Például: [2]
osztály MyClass { int x ; }; int main () { MyClass m ; // a program futása közben nincs hiba, az implicit konstruktor meghívása }Ha egy osztályhoz konstruktorok vannak definiálva, de nincs közöttük alapértelmezett konstruktor, akkor a fordító implicit módon nem generál ilyet. Ez a következőhöz hasonló hibákat eredményez:
osztály MyClass { nyilvános : MyClass ( int y ); // nem alapértelmezett konstruktor deklaráció privát : int x ; }; MyClass :: MyClass ( int y ) { x = y _ } int main () { MyClass m ( 100 ); // MyClass nevű nem alapértelmezett konstruktor * p ; // a fordítónak nem kell tudnia a konstruktorokról, amikor mutatót deklarál p = new MyClass (); // fordítási hiba: nincs alapértelmezett konstruktor return 0 ; }A rámutatott objektum létrehozása pszintén hibát eredményez. [2]
Másrészt a C++11 -nél az alapértelmezett konstruktor kifejezetten megadható:
osztály MyClass { nyilvános : MyClass () = alapértelmezett ; // alapértelmezett konstruktor generálásának kényszerítése };Vagy kifejezetten eltávolították:
osztály MyClass { nyilvános : MyClass () = törlés ; // az alapértelmezett konstruktor generálásának megakadályozása };