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


Перегрузка операции приведения типа



Download 2 Mb.
bet116/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   112   113   114   115   116   117   118   119   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Перегрузка операции приведения типа


Ìîæíî îïðåäåëèòü ôóíêöèè-îïåðaöèè, êîòîðûå áóäóò îñóùåñòâëяòü ïðåîáðaçî- âaíèå îáúåêòa êëañña ê äðóãîìó òèïó. Ôîðìaò:
operator èìя_íîâîãî_òèïa ();
Òèï âîçâðaùaåìîãî çía÷åíèя è ïaðaìåòðû óêaçûâaòü íå òðåáóåòñя. Ìîæíî îïðå- äåëяòü âèðòóaëüíûå ôóíêöèè ïðåîáðaçîâaíèя òèïa.
Ïðèìåð:
mOnstr::OperatOr int(){return health;}

mOnstr Vasia; COut << int(Vasia);


Перегрузка операции вызова функции


Êëaññ, â êîòîðîì îïðåäåëåía îïåðaöèя âûçîâa ôóíêöèè, íaçûâaåòñя ôóínöèî- íaëüíûì. Îò òaêîãî êëañña íå òðåáóåòñя íaëè÷èя äðóãèõ ïîëåé è ìåòîäîâ:
Class if_greater{ publiC:
int OperatOr () (int a, int b) COnst { returna> b;
}
};
Èñïîëüçîâaíèå òaêîãî êëañña èìååò âåñüìa ñïåöèôè÷åñêèé ñèíòaêñèñ. Ðaññìîò- ðèì ïðèìåð:
if_greater x;
COut << x(1, 5) << endl; // Ðåçóëüòaò — 0 COut << if_greater()(5, 1) << endl; // Ðåçóëüòaò — 1
Ïîñêîëüêó â êëaññå if_greater îïðåäåëåía îïåðaöèя âûçîâa ôóíêöèè ñ äâóìя ïa- ðaìåòðaìè, âûðaæåíèå x(1, 5) яâëяåòñя äîïóñòèìûì (òî æå ñaìîå ìîæíî çaïè- ñaòü â âèäå x.OperatOr () (1, 5)). Êaê âèäíî èç ïðèìåða, îáúåêò ôóíêöèîíaëüíîãî êëañña èñïîëüçóåòñя òaê, êaê åñëè áû îí áûë ôóíêöèåé.
Âî âòîðîì îïåðaòîðå âûâîäa âûðaæåíèå if_greater() èñïîëüçóåòñя äëя âûçîâa êîíñòðóêòîða ïî óìîë÷aíèþ êëañña if_greater. Ðåçóëüòaòîì âûïîëíåíèя ýòîãî âûðaæåíèя яâëяåòñя îáúåêò êëañña if_greater. Ä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 òèï êëañña ïðåäñòaâ- ëяåò ìíîæåñòâî çía÷åíèé, äëя êîòîðîãî èíäåêñèðîâaíèå èìååò ñìûñë. Îïåðaöèя èíäåêñèðîâaíèя äîëæía âîçâðaùaòü ññûëêó ía ýëåìåíò, ñîäåðæaùèéñя â ìíîæå- ñòâå. Ïîêaæåì ýòî ía ïðèìåðå êëañña VeCt, ïðåäíaçía÷åííîãî äëя õðaíåíèя è ða- áîòû ñ áåçîïañíûì ìaññèâîì öåëûõ ÷èñåë:
inClude inClude Class VeCt{
publiC:
expliCit VeCt(int n = 10);
VeCt(COnst int a[], int n); //èíèöèaëèçaöèя ìaññèâîì
~VeCt() { delete [] p; } int& OperatOr [] (int i); vOid Print();
… private:
int* p; int size;
};
VeCt::VeCt(int n) : size(n){ p = new int[size];
}
VeCt::VeCt(COnst int a[], int n) : size(n){ p = new int[size];
fOr (inti= 0;i< size; i++) p[i] = a[i];
}
// Ïåðåãðóçêa îïåðaöèè èíäåêñèðîâaíèя:
int& VeCt::OperatOr [] (int i){ if(i<0 ||i >= size){
COut << "Íåâåðíûé èíäåêñ (i=" <exit(0);
}
return p[i];
}
vOid VeCt::Print(){
fOr (inti= 0;i< size; i++) COut << p[i] << " ";
COut << endl;
}

int main(){


int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
VeCt a(arr, 10); a.Print();
COut << a[5] << endl; COut << a[12] << endl; return 0;
}
Ðåçóëüòaò ðaáîòû ïðîãðaììû:
1 2 3 4 5 6 7 8 9 10
6
Íåâåðíûé èíäåêñ (i = 12) Ç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ê expliCit äëя òîãî, ÷òîáû îí íå яâëяëñя êîíñòðóêòîðîì ïðåîáðaçîâaíèя òèïa (ñì. ñ. 185), âûçûâaåìûì íåяâíî. Êëþ÷åâîå ñëîâî expliCit óêaçûâaåò ía òî, ÷òî ýòîò êîíñòðóêòîð áóäåò âûçûâaòüñя òîëüêî яâíûì îáðaçîì.



Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   112   113   114   115   116   117   118   119   ...   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