Перегрузка операции приведения типа
Ìîæíî îïðåäåëèòü ôóíêöèè-îïåð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çîì.
0>
Do'stlaringiz bilan baham: |