Задача этой книги дать краткое и четкое изложение языка С++ в соответствии со стандар том iso/iec 14882. Она предназначена для студентов, изучающих язык «с нуля»



Download 2 Mb.
bet53/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   49   50   51   52   53   54   55   56   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Шаблоны функций


Ìíîãèå 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 ýëåìåíò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 ïðèäåòñя ââîäèòü íîâóþ.
 C++ åñòü ìîùíîå ñðåäñòâî ïaðaìåòðèçaöèè — øaáëîíû. Cóùåñòâóþò øaáëîíû ôóíêöèé è øaáëîíû êëaññîâ (î øaáëîíaõ êëaññîâ ñì. ñ. 211). C ïîìîùüþ ø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öèåé.
Ôîðìaò ïðîñòåñøåñ ôóínöèè-øaáëîía:
template Type> çaãîëîâîê{
/* òåëî ôóíêöèè */
}
Âìåñòî ñëîâa Type ìîæåò èñïîëüçîâaòüñя ïðîèçâîëüíîå èìя.
 îáùåì ñëó÷aå øaáëîí ôóíêöèè ìîæåò ñîäåðæaòü íåñêîëüêî ïaðaìåòðîâ, êaæ- äûé èç êîòîðûõ ìîæåò áûòü íå òîëüêî òèïîì, íî è ïðîñòî ïåðåìåííîé, íaïðè- ìåð:
template vOid f(){ ... }
Íaïðèìåð, ôóíêöèя, ñîðòèðóþùaя ìåòîäîì âûáîða (îí áûë ðaññìîòðåí ía ñ. 59) ìaññèâ èç n ýëåìåíòîâ ëþáîãî òèïa, â âèäå øaáëîía ìîæåò âûãëяäåòü òaê:
template
vOid sOrt_vybOr(Type *b, int n){
Type a; //áóôåðíaя ïåðåìåííaя äëя îáìåía ýëåìåíòîâ fOr (inti= 0; iint imin = i;
fOr (intj=i+ 1; jif (b[j] < b[imin]) imin = j;

a = b[i]; b[i] = b[imin]; b[imin] = a;


}
}
Ãëaâíaя ôóíêöèя ïðîãðaììû, âûçûâaþùåé ýòó ôóíêöèþ-øaáëîí, ìîæåò èìåòü âèä:
inClude
template vOid sOrt_vybOr(Type *b, int n); int main(){
COnst intn= 20; int i, b[n];
fOr (i = 0; i> b[i];
sOrt_vybOr(b, n); // Cîðòèðîâêa öåëî÷èñëåííîãî ìaññèâa fOr (i = 0; iCOut << endl;
dOuble a[] = {0.22, 117, -0.08, 0.21, 42.5};
sOrt_vybOr(a, 5); // Cîðòèðîâêa ìaññèâa âåùåñòâåííûõ ÷èñåë fOr (i = 0; i<5; i++) COut << a[i] << ' ';
return 0;
}
Ïåðâûé æå âûçîâ ôóíêöèè, êîòîðûé èñïîëüçóåò êîíêðåòíûé òèï äaííûõ, ïðèâî- äèò ê ñîçäaíèþ êîìïèëяòîðîì êîäa äëя ñîîòâåòñòâóþùåé âåðñèè ôóíêöèè. Ýòîò ïðîöåññ íaçûâaåòñя èíñòaíöèðîâaíèåì øaáëîía (instantiation). Êîíêðåòíûé òèï äëя èíñòaíöèðîâaíèя ëèáî îïðåäåëяåòñя êîìïèëяòîðîì aâòîìaòè÷åñêè, èñõîäя èç òèïîâ ïaðaìåòðîâ ïðè âûçîâå ôóíêöèè, ëèáî çaäaåòñя яâíûì îáðaçîì. Ïðè ïîâòîðíîì âûçîâå ñ òåì æå òèïîì äaííûõ êîä çaíîâî íå ãåíåðèðóåòñя. Ía ìåñòå ïaðaìåòða øaáëîía, яâëяþùåãîñя íå òèïîì, a ïåðåìåííîé, äîëæíî óêaçûâaòüñя êîíñòaíòíîå âûðaæåíèå1.
Ïðèìåð яâíîãî çaäaíèя aðãóìåíòîâ øaáëîía ïðè âûçîâå:
template vOid f(Y, Z); vOid g(){
f("Vasia", 3.0);
f("Vasia", 3.0); // Z îïðåäåëяåòñя êaê dOuble f("Vasia", 3.0); // Y îïðåäåëяåòñя êaê Char*,aZ— êaê dOuble
// f("Vasia", 3.0); îøèáêa: X îïðåäåëèòü íåâîçìîæíî
}
×òîáû ïðèìåíèòü ôóíêöèþ-øaáëîí ê òèïó äaííûõ, îïðåäåëåííîìó ïîëüçîâaòå- ëåì (ñòðóêòóðå èëè êëaññó), òðåáóåòñя ïåðåãðóçèòü îïåðaöèè äëя ýòîãî òèïa äaí- íûõ, èñïîëüçóåìûå â ôóíêöèè (î ïåðåãðóçêå îïåðaöèé ñì. ñ. 189).
Êaê è îáû÷íûå ôóíêöèè, øaáëîíû ôóíêöèé ìîãóò áûòü ïåðåãðóæåíû nan ñ ïîìî- ùüþ øaáëîíîâ, òan è îáû÷íûìè ôóínöèяìè.
Ìîæíî ïðåäóñìîòðåòü ñïåöèaëüíóþ îáðaáîòêó îòäåëüíûõ ïaðaìåòðîâ è òèïîâ ñ ïî- ìîùüþ ñïåöèaëèçaöèè øaáëîía ôóínöèè. Äîïóñòèì, ìû õîòèì áîëåå ýôôåêòèâíî


1 Ïîäðîáíåå î ïaðaìåòðaõ øaáëîíîâ ðaññêaçûâaåòñя â ðaçäåëå «Øaáëîíû êëaññîâ», ñ. 211.

ðåaëèçîâaòü îáùèé aëãîðèòì ñîðòèðîâêè äëя öåëûõ ÷èñåë.  ýòîì ñëó÷aå ìîæíî


«âðó÷íóþ» çaäaòü âaðèaíò øaáëîía ôóíêöèè äëя ðaáîòû ñ öåëûìè ÷èñëaìè:
vOid sOrt_vibOr(int *b, int n){
… // Òåëî ñïåöèaëèçèðîâaííîãî âaðèaíòa ôóíêöèè
}
Cèãíaòóða øaáëîía ôóíêöèè âêëþ÷aåò íå òîëüêî åå òèï è òèïû ïaðaìåòðîâ, íî è ôaêòè÷åñêèé aðãóìåíò øaáëîía. Îáû÷íaя ôóíêöèя íèêîãäa íå ñ÷èòaåòñя ñïåöèa- ëèçaöèåé øaáëîía, íåñìîòðя ía òî, ÷òî ìîæåò èìåòü òî æå èìя è òèï âîçâðaùaå- ìîãî çía÷åíèя.



Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   49   50   51   52   53   54   55   56   ...   232




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish