Standardkonstruktör

Standardkonstruktorn , i objektorienterade programmeringsspråk,  är en konstruktor som kan anropas utan argument . 

I C++ och Java , om det inte finns några explicit definierade konstruktorer i en klass , använder kompilatorn den implicit definierade standardkonstruktorn, och är vanligtvis en nollkonstruktor. Om programmeraren uttryckligen endast angav en konstruktor med parametrar, kommer kompilatorn inte att skapa en standardkonstruktor.

I C++ och Java, om den härledda klassen inte uttryckligen anropar basklasskonstruktorn (i C++ i initieringslistan, i Java super()på första raden), anropas standardkonstruktorn implicit.

C++

I C++ beskriver standarden en standardkonstruktor som en konstruktor som kan anropas utan att skicka argument (inklusive en konstruktor med parametrar som har ett standardvärde). [1] Till exempel:

klass MyClass { offentliga : Min klass (); // konstruktorn deklareras privat : int x ; }; MyClass :: MyClass () : x ( 100 ) // konstruktor definierad { } int main () { Min Klass m ; // medan programmet körs skapas ett objekt m OCH standardkonstruktorn kallas }

När minnet är dynamiskt allokerat för ett objekt kan konstruktorn anropas genom att lägga till tomma parenteser efter klassnamnet. På sätt och vis är detta ett explicit konstruktoranrop:

int main () { MyClass * pointer = new MyClass (); // vid körning skapas objektet och // standardkonstruktorn kallas }

Om en konstruktör har en eller flera standardparametrar är det fortfarande standardkonstruktorn. Varje klass kan ha högst en standardkonstruktor, antingen utan parametrar eller med standardparametrar, som i det här exemplet:

klass MyClass { offentliga : MyClass ( int i = 0 , std :: string s = "" ); // konstruktör är deklarerad (prototyp) privat : int x ; int y ; std :: stringz ; _ }; MyClass :: MyClass ( int i , std :: string s ) // konstruktor definierad { x = 100 ; y = i ; z = s ; }

I C++ är standardkonstruktorer viktiga eftersom de automatiskt anropas under vissa omständigheter, och därför måste en klass under vissa förhållanden ha en standardkonstruktor, annars kommer ett fel att uppstå:

  • När ett objekt deklareras utan argument (till exempel MyClass x;) eller en ny instans skapas i minnet (till exempel new MyClass;eller new MyClass();).
  • När en array av objekt deklareras, såsom MyClass x[10];; eller deklareras dynamiskt, till exempel new MyClass [10]. Standardkonstruktorn initierar alla medlemmar.
  • När den underordnade klassen inte uttryckligen anger konstruktorn för den överordnade klassen i initieringslistan.
  • När en klasskonstruktor inte uttryckligen anropar konstruktorn för åtminstone ett av dess objektfält i initialiseringslistan.
  • I standardbiblioteket fyller vissa behållare i sina värden med hjälp av standardkonstruktörer om ett värde inte är explicit specificerat. Fyller till exempel vector<MyClass>(10);en vektor med tio element initierade med en standardkonstruktor.

Om en klass inte definierar en standardkonstruktor kommer kompilatorn implicit att skapa en. Det kommer att vara detsamma som en explicit deklarerad konstruktör med en tom kropp. Till exempel: [2]

klass MyClass { int x ; }; int main () { Min Klass m ; // det finns inget fel när programmet körs, den implicita konstruktorn kallas }

Om konstruktörer är definierade för en klass, men det inte finns någon standardkonstruktor bland dem, kommer kompilatorn inte implicit att generera en. Detta resulterar i fel som det här exemplet:

klass MyClass { offentliga : MyClass ( int y ); // icke-standardkonstruktordeklaration privat : int x ; }; MyClass :: MyClass ( int y ) { x = y _ } int main () { MyClass m ( 100 ); // icke-standardkonstruktor som heter MyClass * p ; // kompilatorn behöver inte veta om konstruktörer när man deklarerar en pekare p = new MyClass (); // fel vid kompilering: ingen standardkonstruktor returnerar 0 ; }

Att skapa ett objekt som pekas ppå kommer också att resultera i ett fel. [2]

Å andra sidan, med C++11 kan standardkonstruktorn uttryckligen anges:

klass MyClass { offentliga : MyClass () = default ; // kraftgenerering av en standardkonstruktor };

Eller uttryckligen borttagen:

klass MyClass { offentliga : MyClass () = ta bort ; // förhindra generering av standardkonstruktor };

Java

klass DefaultConstructor { int a = 10 ; public int getInt () { returnera en ; } } klass Main { public static void main ( String [] args ) { DefaultConstructor Dc = new DefaultConstructor (); //Default constructor System . ut . println ( Dc . getInt () ); } } // Fel!

Anteckningar

  1. C++ standard, ISO/IEC 14882:1998, 12.1.5
    C++ standard, ISO/IEC 14882:2003, 12.1.5
  2. 1 2 Datavetenskap A Structured Approach Using C++ av Behrouz A. Forouzan och Richard F. Gilberg