Операция reinterpret_cast
Îïåðaöèя reinterpret_Cast ïðèìåíяåòñя äëя ïðåîáðaçîâaíèя íå ñâяçaííûõ ìåæäó ñîáîé òèïîâ, íaïðèìåð, óêaçaòåëåé â öåëûå èëè íaîáîðîò, a òaêæå óêaçaòåëåé òèïa vOid* â êîíêðåòíûé òèï. Ïðè ýòîì âíóòðåííåå ïðåäñòaâëåíèå äaííûõ îñòa- åòñя íåèçìåííûì, a èçìåíяåòñя òîëüêî òî÷êa çðåíèя êîìïèëяòîða ía äaííûå.
Ôîðìaò îïåðaöèè:
reinterpret_cast <òèï> (âûðaæåíèå)
Ðåçóëüòaò îïåðaöèè èìååò óêaçaííûé òèï, êîòîðûé ìîæåò áûòü ññûëêîé, óêaça- òåëåì, öåëûì èëè âåùåñòâåííûì òèïîì.
Ïðèìåð:
Char *p = reinterpret_Cast (mallOC(100)); lOng l = reinterpret_Cast (p);
Ðaçëè÷èå ìåæäó statiC_Cast è reinterpret_Cast ïîçâîëяåò êîìïèëяòîðó ïðîèçâî- äèòü ìèíèìaëüíóþ ïðîâåðêó ïðè èñïîëüçîâaíèè statiC_Cast, a ïðîãðaììèñòó — îáîçía÷aòü îïañíûå ïðåîáðaçîâaíèя ñ ïîìîùüþ reinterpret_Cast. Ðåçóëüòaò ïðå- îáðaçîâaíèя îñòaåòñя ía ñîâåñòè ïðîãðaììèñòa.
Ìåõaíèçì èäåíòèôèêaöèè òèïa âî âðåìя âûïîëíåíèя ïðîãðaììû (RTTI) ïîçâî- ëяåò îïðåäåëяòü, ía êaêîé òèï â òåêóùèé ìîìåíò âðåìåíè ññûëaåòñя óêaçaòåëü, a òaêæå ñðaâíèâaòü òèïû îáúåêòîâ. Äëя äîñòóïa ê RTTI â ñòaíäaðò яçûêa ââåäåía îïåðaöèя typeid è êëaññ type_infO1.
Ôîðìaò îïåðaöèè typeid:
typeid (òèï) typeid (âûðaæåíèå)
Îïåðaöèя ïðèíèìaåò â êa÷åñòâå ïaðaìåòða èìя òèïa èëè âûðaæåíèå è âîçâðaùa- åò ññûëêó ía îáúåêò êëañña type_infO, ñîäåðæaùèé èíôîðìaöèþ î òèïå. Åñëè îïå- ðaöèя íå ìîæåò îïðåäåëèòü òèï îïåðaíäa, ïîðîæäaåòñя èñêëþ÷åíèå bad_typeid.
1 Â ñòaðûõ âåðñèяõ êîìïèëяòîðîâ ýòîò êëaññ ìîæåò íaçûâaòüñя Type_infO èëè typeinfO.
Êîãäa îïåðaíä ïðåäñòaâëяåò ñîáîé óêaçaòåëü èëè ññûëêó ía ïîëèìîðôíûé òèï, ðåçóëüòaòîì яâëяåòñя äèíaìè÷åñêaя èíôîðìaöèя î òèïå (òî åñòü îáúåêò type_infO ñîäåðæèò èíôîðìaöèþ î òèïå îáúåêòa, ía êîòîðûé â äaííûé ìîìåíò ññûëaåòñя óêaçaòåëü).
Åñëè îïåðaíäîì яâëяåòñя âûðaæåíèå, ïðåäñòaâëяþùåå ñîáîé ññûëêó ía íåïîëè- ìîðôíûé òèï, îáúåêò type_infO ñîäåðæèò èíôîðìaöèþ î òèïå âûðaæåíèя, a íå î òèïå îáúåêòa, ía êîòîðûé îíî ññûëaåòñя.
Îïåðaöèþ typeid ìîæíî èñïîëüçîâaòü êaê ñ îñíîâíûìè, òaê è ñ ïðîèçâîäíûìè òèïaìè äaííûõ.
Êëaññ type_infO îïèñaí â çaãîëîâî÷íîì ôaéëå ñëåäóþùèì îáðaçîì:
Class type_infO{ publiC:
virtual ~type_infO();
bOOl OperatOr==(COnst type_infO& rhs) COnst; bOOl OperatOr!=(COnst type_infO& rhs) COnst; bOOl befOre(COnst type_infO& rhs) COnst; COnst Char* name() COnst;
private:
type_infO(COnst type_infO& rhs);
type_infO& OperatOr=(COnst type_infO& rhs);
};
Ìåòîä name âîçâðaùaåò óêaçaòåëü ía ñòðîêó, ïðåäñòaâëяþùóþ èìя òèïa, îïèñû- âaåìîãî îáúåêòîì òèïa type_infO.
Âèðòóaëüíûé äåñòðóêòîð äåëaåò êëaññ type_infO ïîëèìîðôíûì.
Êîíñòðóêòîð êîïèðîâaíèя è îïåðaöèя ïðèñâaèâaíèя îáúяâëåíû êaê private, ÷òî- áû èñêëþ÷èòü âîçìîæíîñòü ñëó÷aéíîãî êîïèðîâaíèя è ïðèñâaèâaíèя îáúåêòîâ êëañña.
Îïåðaöèè == è != ïîçâîëяþò ñðaâíèâaòü äâa îáúåêòa ía ðaâåíñòâî è íåðaâåíñòâî, a ôóíêöèя befOre âûïîëíяåò ïîáóêâåííîå ñðaâíåíèå èìåí äâóõ òèïîâ. Äëя ñðaâ- íåíèя èñïîëüçóåòñя êîíñòðóêöèя âèäa:
typeid(T1).befOre(typeid(T2))
Åñëè èìя òèïa Ò1 ëåêñèêîãðaôè÷åñêè ïðåäøåñòâóåò èìåíè Ò2, ðåçóëüòaò áóäåò èñ- òèííûì.
Òî÷íaя èíôîðìaöèя î òèïå îáúåêòa âî âðåìя âûïîëíåíèя ïðîãðaììû ìîæåò ïî- òðåáîâaòüñя, íaïðèìåð, êîãäa ïðîãðaììèñò ðañøèðяåò ôóíêöèîíaëüíîñòü íåêî- òîðîãî áèáëèîòå÷íîãî áaçîâîãî êëañña ñ ïîìîùüþ ïðîèçâîäíîãî, è íåâîçìîæíî èëè áåññìûñëåííî äîáaâëяòü ê áaçîâîìó êëaññó âèðòóaëüíûå ôóíêöèè. Íaïðè- ìåð:
inClude Class B{
publiC: virtual ~B(){};
};
Class C: publiC B{
publiC: virtual vOid sOme_methOd(){ … };
};
vOid demO(B* p){
if (typeid(*p) == typeid(C)) dynamiC_Cast(p)->sOme_methOd();
}
int main(){
C* C = new C; demO(C); return 0;
}
Èíôîðìaöèþ î òèïå ïîëåçíî èñïîëüçîâaòü è â äèaãíîñòè÷åñêèõ öåëяõ:
vOid print_type(sOme_Obj *p){ COut << typeid(*p).name();
}
Îïåðaöèя typeid íå äîëæía ïðèìåíяòüñя âìåñòî âèðòóaëüíûõ ôóíêöèé è â ñëó-
÷aяõ, êîãäa òèï îáúåêòa ìîæíî îïðåäåëèòü ía ýòaïå êîìïèëяöèè.
Do'stlaringiz bilan baham: |