Alapértelmezett konstruktor

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.

C++

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:

  • Amikor egy objektumot argumentumok nélkül deklarálnak (például MyClass x;), vagy új példány jön létre a memóriában (például new MyClass;vagy new MyClass();).
  • Ha objektumok tömbje deklarálva van, például MyClass x[10];; vagy dinamikusan deklarálva például new MyClass [10]. Az alapértelmezett konstruktor inicializálja az összes tagot.
  • Amikor az utódosztály nem határozza meg kifejezetten a szülőosztály konstruktorát az inicializálási listában.
  • Amikor egy osztálykonstruktor nem hívja meg kifejezetten az inicializálási listában lévő objektummezői közül legalább egy konstruktort.
  • A szabványos könyvtárban bizonyos tárolók alapértelmezett konstruktorokkal töltik ki értékeiket, ha az érték nincs kifejezetten megadva. Például vector<MyClass>(10);egy vektort tíz elemmel tölt meg egy alapértelmezett konstruktorral.

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

Java

class DefaultConstructor { int a = 10 ; public int getInt () { return a ; } } class { public static void main ( String [ ] args ) { DefaultConstructor Dc = new DefaultConstructor (); //Alapértelmezett konstruktor Rendszer . ki . println ( Dc . getInt () ); } } // Tévedés!

Jegyzetek

  1. C++ szabvány, ISO/IEC 14882:1998, 12.1.5
    C++ szabvány, ISO/IEC 14882:2003, 12.1.5
  2. 1 2 Számítástechnika Strukturált megközelítés C++ használatával, Behrouz A. Forouzan és Richard F. Gilberg