×añòî áûâaåò óäîáíî, ÷òîáû ôóíêöèè, ðåaëèçóþùèå îäèí è òîò æå aëãîðèòì äëя ðaçëè÷íûõ òèïîâ äaííûõ, èìåëè îäíî è òî æå èìя. Åñëè ýòî èìя ìíåìîíè÷íî, òî åñòü íåñåò íóæíóþ èíôîðìaöèþ, ýòî äåëaåò ïðîãðaììó áîëåå ïîíяòíîé, ïîñêîëü- êó äëя êaæäîãî äåéñòâèя òðåáóåòñя ïîìíèòü òîëüêî îäíî èìя. Èñïîëüçîâaíèå íå- ñêîëüêèõ ôóíêöèé ñ îäíèì è òåì æå èìåíåì, íî ñ ðaçëè÷íûìè òèïaìè ïaðaìåò- ðîâ, íaçûâaåòñя ïåðåãðóçnîñ ôóínöèñ.
Êîìïèëяòîð îïðåäåëяåò, êaêóþ èìåííî ôóíêöèþ òðåáóåòñя âûçâaòü, ïî òèïó ôaêòè÷åñêèõ ïaðaìåòðîâ. Ýòîò ïðîöåññ íaçûâaåòñя ðaçðåøåíèåì ïåðåãðóçêè (ïå- ðåâîä aíãëèéñêîãî ñëîâa resolution â ñìûñëå «óòî÷íåíèå»). Òèï âîçâðaùaåìîãî ôóíêöèåé çía÷åíèя â ðaçðåøåíèè íå ó÷añòâóåò. Ìåõaíèçì ðaçðåøåíèя îñíîâaí ía äîñòaòî÷íî ñëîæíîì íaáîðå ïðaâèë, ñìûñë êîòîðûõ ñâîäèòñя ê òîìó, ÷òîáû èñïîëüçîâaòü ôóíêöèþ ñ íaèáîëåå ïîäõîäяùèìè aðãóìåíòaìè è âûäaòü ñîîáùå- íèå, åñëè òaêîé íå íaéäåòñя. Äîïóñòèì, èìååòñя ÷åòûðå âaðèaíòa ôóíêöèè, îïðå- äåëяþùåé íaèáîëüøåå çía÷åíèå:
// Âîçâðaùaåò íaèáîëüøåå èç äâóõ öåëûõ:
int max(int, int);
// Âîçâðaùaåò ïîäñòðîêó íaèáîëüøåé äëèíû:
Char* max(Char*, Char*);
// Âîçâðaùaåò íaèáîëüøåå èç ïåðâîãî ïaðaìåòða è äëèíû âòîðîãî: int max (int, Char*);
// Âîçâðaùaåò íaèáîëüøåå èç âòîðîãî ïaðaìåòða è äëèíû ïåðâîãî: int max (Char*, int);
vOid f(int a, int b, Char* C, Char* d){
COut << max (a, b) << max(C, d) << max(a, C) << max(C, b);
}
Ïðè âûçîâå ôóíêöèè max êîìïèëяòîð âûáèðaåò ñîîòâåòñòâóþùèé òèïó ôaêòè÷å- ñêèõ ïaðaìåòðîâ âaðèaíò ôóíêöèè (â ïðèâåäåííîì ïðèìåðå áóäóò ïîñëåäîâa- òåëüíî âûçâaíû âñå ÷åòûðå âaðèaíòa ôóíêöèè).
Åñëè òî÷íîãî ñîîòâåòñòâèя íå íaéäåíî, âûïîëíяþòñя ïðîäâèæåíèя òèïîâ â ñîîò- âåòñòâèè ñ îáùèìè ïðaâèëaìè (ñì. ñ. 38 è ïðèëîæåíèå 3), íaïðèìåð, bOOl è Char â int, flOat â dOuble è ò. ï. Äaëåå âûïîëíяþòñя ñòaíäaðòíûå ïðåîáðaçîâaíèя òè- ïîâ, íaïðèìåð, int â dOuble èëè óêaçaòåëåé â vOid*. Cëåäóþùèì øaãîì яâëяåòñя âûïîëíåíèå ïðåîáðaçîâaíèé òèïa, çaäaííûõ ïîëüçîâaòåëåì (îá ýòèõ ïðåîáðaçî- âaíèяõ ðaññêaçûâaåòñя âî âòîðîé ÷añòè êíèãè, ñ. 195), a òaêæå ïîèñê ñîîòâåòñò- âèé ça ñ÷åò ïåðåìåííîãî ÷èñëa aðãóìåíòîâ ôóíêöèé. Åñëè ñîîòâåòñòâèå ía îäíîì è òîì æå ýòaïå ìîæåò áûòü ïîëó÷åíî áîëåå ÷åì îäíèì ñïîñîáîì, âûçîâ ñ÷èòaåòñя íåîäíîçía÷íûì è âûäaåòñя ñîîáùåíèå îá îøèáêå.
Íåîäíîçía÷íîñòü ìîæåò ïîяâèòüñя ïðè:
ïðåîáðaçîâaíèè òèïa;
èñïîëüçîâaíèè ïaðaìåòðîâ-ññûëîê;
èñïîëüçîâaíèè aðãóìåíòîâ ïî óìîë÷aíèþ.
Ïðèìåð íåîäíîçía÷íîñòè ïðè ïðåîáðaçîâaíèè òèïa:
inClude flOat f(flOat i){
COut << "funCtiOn flOat f(flOat i)" << endl; return i;
}
dOuble f(dOuble i){
COut << "funCtiOn dOuble f(dOuble i)" << endl; return i*2;
}
int main(){
flOat x = 10.09; dOuble y = 10.09;
COut << f(x) << endl; // Âûçûâaåòñя f(flOat) COut << f(y) << endl; // Âûçûâaåòñя f(dOuble)
/* COut << f(10) << endl; Íåîäíîçía÷íîñòü — êaê ïðåîáðaçîâaòü 10: âî flOat èëè dOuble? */
return 0;
}
Äëя óñòðaíåíèя ýòîé íåîäíîçía÷íîñòè òðåáóåòñя яâíîå ïðèâåäåíèå òèïa äëя êîíñòaíòû 10.
Ïðèìåð íåîäíîçía÷íîñòè ïðè èñïîëüçîâaíèè ïaðaìåòðîâ-ññûëîê: åñëè îäía èç ïåðåãðóæaåìûõ ôóíêöèé îáúяâëåía êaê int f(int a, int b), a äðóãaя — êaê int f(int a, int &b), òî êîìïèëяòîð íå ñìîæåò óçíaòü, êaêaя èç ýòèõ ôóíêöèé âûçûâa- åòñя, òaê êaê íåò ñèíòaêñè÷åñêèõ ðaçëè÷èé ìåæäó âûçîâîì ôóíêöèè, êîòîðaя ïî- ëó÷aåò ïaðaìåòð ïî çía÷åíèþ, è âûçîâîì ôóíêöèè, êîòîðaя ïîëó÷aåò ïaðaìåòð ïî ññûëêå.
Ïðèìåð íåîäíîçía÷íîñòè ïðè èñïîëüçîâaíèè aðãóìåíòîâ ïî óìîë÷aíèþ:
inClude int f(int a){return a;}
int f(int a, int b = 1){returna* b;} int main(){
COut << f(10, 2); // Âûçûâaåòñя f(int, int)
/* COut << f(10); Íåîäíîçía÷íîñòü — ÷òî âûçûâaåòñя: f(int, int) èëè f(int) ? */
return 0;
}
Íèæå ïðèâåäåíû ïðaâèëa îïèñaíèя ïåðåãðóæåííûõ ôóíêöèé.
Ïåðåãðóæåííûå ôóíêöèè äîëæíû íaõîäèòüñя â îäíîñ îáëañòè âèäèìîñòè, èía÷å ïðîèçîéäåò ñîêðûòèå aíaëîãè÷íî îäèíaêîâûì èìåíaì ïåðåìåííûõ âî âëîæåííûõ áëîêaõ.
Ïåðåãðóæåííûå ôóíêöèè ìîãóò èìåòü ïaðaìåòðû ïî óìîë÷aíèþ, ïðè ýòîì çía÷åíèя îäíîãî è òîãî æå ïaðaìåòða â ðaçíûõ ôóíêöèяõ äîëæíû ñîâïaäaòü.  ðaçëè÷íûõ âaðèaíòaõ ïåðåãðóæåííûõ ôóíêöèé ìîæåò áûòü ðaçëè÷íîå êî- ëè÷åñòâî ïaðaìåòðîâ ïî óìîë÷aíèþ.
Ôóíêöèè íå ìîãóò áûòü ïåðåãðóæåíû, åñëè îïèñaíèå èõ ïaðaìåòðîâ îòëè÷a- åòñя òîëüêî ìîäèôènaòîðîì COnst èëè èñïîëüçîâaíèåì ññûënè (íaïðèìåð, int è COnst int èëè int è int&).
Do'stlaringiz bilan baham: |