Standard konstruktør

Standardkonstruktøren i objektorienterede programmeringssprog  er en konstruktør , der kan kaldes uden argumenter . 

I C++ og Java , hvis der ikke er nogen eksplicit definerede konstruktører i en klasse , så bruger compileren den implicit definerede standardkonstruktør og er normalt en null konstruktør. Hvis programmøren eksplicit kun har angivet en konstruktør med parametre, vil compileren ikke oprette en standardkonstruktør.

I C++ og Java, hvis den afledte klasse ikke eksplicit kalder basisklassekonstruktøren (i C++ i initialiseringslisten, i Java super()på første linje), så kaldes standardkonstruktøren implicit.

C++

I C++ beskriver standarden en standardkonstruktør som en konstruktør, der kan kaldes uden at sende argumenter (inklusive en konstruktør med parametre, der har en standardværdi). [1] For eksempel:

klasse MyClass { offentligt : Min klasse (); // konstruktør er erklæret privat : int x ; }; MyClass :: MyClass () : x ( 100 ) // constructor defined { } int main () { Min klasse m ; // mens programmet kører, oprettes et objekt m OG standardkonstruktøren kaldes }

Når hukommelse er dynamisk allokeret til et objekt, kan konstruktøren kaldes ved at tilføje tomme parenteser efter klassenavnet. På en måde er dette et eksplicit konstruktørkald:

int main () { MyClass * pointer = new MyClass (); // ved kørsel oprettes objektet og // standardkonstruktøren kaldes }

Hvis en konstruktør har en eller flere standardparametre, er den stadig standardkonstruktøren. Hver klasse kan højst have én standardkonstruktør, enten uden parametre eller med standardparametre, som i dette eksempel:

klasse MyClass { offentligt : MyClass ( int i = 0 , std :: string s = "" ); // konstruktør er erklæret (prototype) privat : int x ; int y ; std :: stringz ; _ }; MyClass :: MyClass ( int i , std :: string s ) // constructor defined { x = 100 ; y = i ; z = s ; }

I C++ er standardkonstruktører essentielle, fordi de automatisk kaldes under visse omstændigheder, og derfor skal en klasse under visse forhold have en standardkonstruktør, ellers vil der opstå en fejl:

  • Når et objekt erklæres uden argumenter (f.eks. MyClass x;), eller der oprettes en ny instans i hukommelsen (f.eks. new MyClass;eller new MyClass();).
  • Når en række objekter erklæres, såsom MyClass x[10];; eller deklareres dynamisk, f.eks new MyClass [10]. Standardkonstruktøren initialiserer alle medlemmer.
  • Når den underordnede klasse ikke eksplicit angiver konstruktøren af ​​den overordnede klasse i initialiseringslisten.
  • Når en klassekonstruktør ikke eksplicit kalder konstruktøren af ​​mindst et af dens objektfelter i initialiseringslisten.
  • I standardbiblioteket udfylder visse containere deres værdier ved hjælp af standardkonstruktører, hvis en værdi ikke er eksplicit angivet. Fylder for eksempel vector<MyClass>(10);en vektor med ti elementer initialiseret med en standardkonstruktør.

Hvis en klasse ikke definerer en standardkonstruktør, vil compileren implicit oprette en. Det vil være det samme som en eksplicit erklæret konstruktør med en tom krop. For eksempel: [2]

klasse MyClass { int x ; }; int main () { Min klasse m ; // der er ingen fejl mens programmet kører, den implicitte konstruktør kaldes }

Hvis konstruktører er defineret for en klasse, men der ikke er nogen standardkonstruktør blandt dem, vil compileren ikke implicit generere en. Dette resulterer i fejl som dette eksempel:

klasse MyClass { offentligt : MyClass ( int y ); // ikke-standard konstruktørerklæring privat : int x ; }; MyClass :: MyClass ( int y ) { x = y _ } int main () { MyClass m ( 100 ); // ikke-standard konstruktør kaldet MyClass * p ; // compiler behøver ikke at vide om konstruktører, når de erklærer en pointer p = new MyClass (); // fejl på kompileringstidspunktet: ingen standardkonstruktør returnerer 0 ; }

Oprettelse af et objekt, der peges ppå, vil også resultere i en fejl. [2]

På den anden side, med C++11 kan standardkonstruktøren udtrykkeligt specificeres:

klasse MyClass { offentligt : MyClass () = default ; // kraftgenerering af en standardkonstruktør };

Eller eksplicit fjernet:

klasse MyClass { offentligt : MyClass () = slet ; // forhindre generering af standardkonstruktør };

Java

klasse DefaultConstructor { int a = 10 ; public int getInt () { returnere en ; } } klasse Main { public static void main ( String [] args ) { DefaultConstructor Dc = new DefaultConstructor (); //Standard konstruktør System . ud . println ( Dc . getInt () ); } } // Forkert!

Noter

  1. C++ standard, ISO/IEC 14882:1998, 12.1.5
    C++ standard, ISO/IEC 14882:2003, 12.1.5
  2. 1 2 Computer Science A Structured Approach Using C++ af Behrouz A. Forouzan og Richard F. Gilberg