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



Download 2 Mb.
bet142/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   138   139   140   141   142   143   144   145   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Операция 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ïå êîìïèëяöèè.

Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   138   139   140   141   142   143   144   145   ...   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