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.
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å:
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 };