Ohjelmoinnissa oletusargumentti on funktion argumentti , joka on valinnainen kutsuttaessa . Useimmissa ohjelmointikielissä funktiot voivat ottaa yhden tai useamman argumentin. Pääsääntöisesti kaikki argumentit on määritettävä kokonaan (kuten C-ohjelmointikielessä [1] ). Myöhemmin jotkut kielet (esimerkiksi C++ ) antoivat ohjelmoijalle mahdollisuuden määrittää joidenkin argumenttien arvot funktion määrittelyssä. Näin ollen funktio voidaan kutsua välittämällä vain vaaditut argumentit.
Harkitse seuraavaa funktioilmoitusta:
int my_func ( int a , int b , int c = 12 );Tämä funktio ottaa kolme argumenttia, joista viimeisen oletusarvo on 12. Ohjelmoija voi kutsua tätä funktiota kahdella tavalla:
tulos = my_func ( 1 , 2 , 3 ); tulos = my_func ( 1 , 2 );Ensimmäisessä tapauksessa argumentin c arvo määritetään funktiokutsussa ja se on kolme. Toisessa tapauksessa viimeinen argumentti jätetään pois ja c :ksi asetetaan kaksitoista .
Oletusargumentit asetetaan viimeisestä argumentista alkaen.
Virtuaalimenetelmien oletusargumentteja ei määritetä ajon aikana objektin tyypin mukaan, vaan ne otetaan osoittimen tyypistä. Tässä esimerkissä konsolin näyttö näyttää 1 Derived:
luokan tukikohta { julkinen : virtuaalinen void foo ( int x = 1 ) { std :: cout << x << "Perus" ; } }; luokka Johtettu : julkinen tukikohta { julkinen : void foo ( int x = 2 ) override { std :: cout << x << "Johdatettu" ; } }; int main () { Perus * x = uusi johdettu ; x -> foo (); // "1 johdettu" return 0 ; }Jäsenfunktioille voidaan määrittää oletusargumenttiarvot määritelmissä. Tällaisia toimintoja voidaan kutsua oletusarvoilla vain, jos ne määritellään ennen kutsua. Esimerkki:
rakenne C { void g ( int i , int j = 99 ); C ( int a ); }; C :: C ( int = 5 ) { } void C :: g ( int i = 88 , int j ) { }Jotkut muut kielet, kuten Java , eivät tue oletusargumentteja. Tämä käyttäytyminen voidaan kuitenkin toistaa käyttämällä menetelmän ylikuormitusta , jolla on sama nimi ja vähemmän argumentteja:
int MyFunc ( int a , int b ) { return MyFunc ( a , b , 12 ); } int MyFunc ( int a , int b , int c ) { /* päätoteutus */ }Jokaiselle funktiokutsulle on välitettävä oletusargumenttiarvot kutsutulle funktiolle. Tämä johtaa koodin toistoon. Oletusargumentit poistetaan tämän välttämiseksi.
Jos oletusargumentti ei ole vain literaali, vaan lauseke, tämä lauseke voidaan arvioida kerran koko ohjelmalle.
Python on huomionarvoinen siitä, että se arvioi oletusargumenttien lausekkeet vain kerran, moduulin latauksen aikana. Jos haluat arvioida arvon jokaisessa funktiokutsussa, voit määrittää argumentille signaaliarvon (esimerkiksi NonePythonissa) ja tarkistaa sen sitten funktion ensimmäisellä rivillä.
Esimerkiksi Pythonin oletusargumentit voidaan toteuttaa seuraavasti:
tuonti datetime def f ( a , b = Ei mitään ): b = b tai datetime . päivämääräaika . nyt ()