Överbelastningsprocedurer och funktioner

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 16 februari 2017; kontroller kräver 5 redigeringar .

Överbelastning av procedurer och funktioner  - möjligheten att använda subrutiner med samma namn: procedurer eller funktioner i programmeringsspråk.

Anledning till

I de flesta tidiga programmeringsspråk fanns det, för att förenkla översättningsprocessen, en begränsning att inte mer än en procedur med samma namn kunde vara tillgänglig i ett program samtidigt. Enligt denna begränsning måste alla subrutiner som är synliga vid en given punkt i programmet ha olika namn.

Namnen och beteckningarna på procedurer och funktioner som ingår i programmeringsspråket kan inte användas av programmeraren för att namnge sina egna subrutiner.

Implementering

För att kunna använda flera varianter av en subrutin med samma namn, men med ett annat antal argument eller andra typer av argument (det vill säga med en annan signatur , eftersom argumentlistan är en del av signaturen), subrutin överbelastning införs. Sådan överbelastning är möjlig inom det procedurmässiga paradigmet , utan användning av objektorienterad programmering.

Under översättningen styrs procedurer och funktioner med samma namn så att de skiljer sig i signatur, eftersom översättaren i detta fall unikt kan bestämma anropet till den önskade subrutinen.

För att eliminera misstaget hos en programmerare som av misstag gav ett namn till en subrutin som redan används, införs ett ytterligare krav på att skriva ett nyckelord. Detta görs till exempel i språket Delphi (nyckelordet överbelastning).

Funktionsöverbelastningsregler

Överbelastade funktioner har samma namn men olika antal eller typer av argument. Detta är en sorts statisk polymorfism , där frågan om vilken funktion som ska anropas avgörs av listan över dess argument. Detta tillvägagångssätt används i statiskt skrivna språk, som kontrollerar typerna av argument när en funktion anropas. En överbelastad funktion är faktiskt flera olika funktioner, och valet av den lämpliga sker vid kompilering. Funktionsöverbelastning ska inte förväxlas med former av polymorfism där rätt metod väljs vid körning, till exempel genom virtuella funktioner, snarare än statiskt.

Exempel: Funktionsöverbelastning i C++

huvud () { cout << volym ( 10 ); cout << volym ( 2,5 , 8 ); cout << volym ( 100 , 75 , 15 ); } // volym av en kub int volym ( int s ) { return ( s * s * s ); } // volym av en cylinder dubbel volym ( dubbel r , int h ) { retur ( 3,14 * r * r * h ); } // volym av en kubisk lång volym ( lång l , int b , int h ) { return ( l * b * h ); }

I exemplet ovan beräknas volymen av de olika komponenterna med anrop till olika "volym"-funktioner med argument som skiljer sig i datatyp eller kvantitet.

Exempel: funktionsöverbelastning i Nim-språket.

proc överbelastning ( x : int ) = eko "sträng int" proc överbelastning ( x : float ) = eko "strängflytande" överbelastning ( 1 ) # kommer att skriva ut "sträng int" overload ( 1.1 ) # kommer att skriva ut "string float"

Konstruktör överbelastning

Konstruktörer som används för att instansiera objekt kan också överbelastas i vissa objektorienterade programmeringsspråk. Eftersom namnet på konstruktören på många språk är fördefinierat av klassens namn, verkar det som att det bara kan finnas en konstruktor. Närhelst flera konstruktörer krävs, implementeras de som överbelastade funktioner. Standardkonstruktorn tar inga parametrar, objektinstansen tar null-medlemmar. [ 1 ] Till exempel kan standardkonstruktorn för ett fakturaobjekt i en restaurang skrivet i C++ ställa in Tips till 15 %:

räkning () { tips = 15,0 ; totalt = 0,0 ; }

Nackdelen är att det krävs två steg för att ändra värdet på det skapade Bill-objektet. Följande visar skapandet och modifieringen av värden inom huvudprogrammet:

Bill café ; kafé . tips = 10,00 ; kafé . totalt = 4,00 ;

Genom konstruktoröverbelastning skulle det vara möjligt att skicka ett tips och den allmänna kvaliteten på parametrar under skapandet. Exemplet visar en överbelastad konstruktor med två parametrar:

Bill ( dubbel setTip , dubbel setTotal ) { tip = set Tips ; total = setTotal ; }

Nu kan funktionen som skapar det nya Bill-objektet skicka två värden till konstruktorn och ställa in datamedlemmarna i ett steg. Följande visar hur du skapar och ställer in värden:

Bill cafe ( 10.00 , 4.00 );

Detta kan vara användbart för att göra program mer effektiva och minska kodstorleken.

Varningar

Att överbelasta en procedur eller funktion flera gånger kan göra det svårt för utvecklare att veta vilken överbelastning som används vid vilken tidpunkt.

Resursintensitet

Möjligheten att överbelasta namnen på procedurer och funktioner i programmet bestäms av kompilatorns tolkningsförmåga och kraven i standarden för språket för att skriva dem. Syntaktisk analys består i att matcha anropet av en överbelastad funktion med en specifik funktion (med en specifik signatur) och påverkar inte resursförbrukningen för programmet och dess exekveringstid.

Storleken på den kompilerade programkoden när man använder en funktionsöverbelastning istället för en funktion med ett godtyckligt antal argument ökar (istället för en procedur med ett variabelt antal argument kompileras flera för ett specifikt antal), men istället programprestandan ökar vid anrop av en procedur som beskrivs som överbelastad (ingen typanalys utförs och andra beräkningsoperationer under programexekveringen). Så, till exempel, i C++ STL-biblioteket ersätts ofta använda funktioner med ett varierande antal argument av överbelastningar.

Se även