Типы данных, определяемые пользователем
 ðå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ììèñòîì.
Переименование типов (typedef)
Äëя òîãî ÷òîáû ñäåëaòü ïðîãðaììó áîëåå яñíîé, ìîæíî çaäaòü òèïó íîâîå èìя ñ ïîìîùüþ êëþ÷åâîãî ñëîâa typedef:
typedef òèï íîâîå_èìя [ ðaçìåðíîñòü ];
 äaííîì ñëó÷aå êâaäðaòíûå ñêîáêè яâëяþòñя ýëåìåíòîì ñèíòaêñèña. Ðaçìåð- íîñòü ìîæåò îòñóòñòâîâaòü. Ïðèìåðû:
typedef unsigned int UINT; typedef Char Msg[100]; typedef struCt{
Char fiO[30]; int date, COde;
dOuble salary;} WOrker;
Ââåäåííîå òaêèì îáðaçîì èìя ìîæíî èñïîëüçîâaòü òaêèì æå îáðaçîì, êaê è èìå- ía ñòaíäaðòíûõ òèïîâ:
UINT i, j; // äâå ïåðåìåííûõ òèïa unsigned int Msg str[10]; // ìaññèâ èç 10 ñòðîê ïî 100 ñèìâîëîâ WOrker stuff[100]; // ìaññèâ èç 100 ñòðóêòóð
Êðîìå çaäaíèя òèïaì ñ äëèííûìè îïèñaíèяìè áîëåå êîðîòêèõ ïñåâäîíèìîâ, typedef èñïîëüçóåòñя äëя îáëåã÷åíèя ïåðåíîñèìîñòè ïðîãðaìì: åñëè ìaøèí- íî-çaâèñèìûå òèïû îáúяâèòü ñ ïîìîùüþ îïåðaòîðîâ typedef, ïðè ïåðåíîñå ïðî- ãðaììû ïîòðåáóåòñя âíåñòè èçìåíåíèя òîëüêî â ýòè îïåðaòîðû.
Перечисления (enum)
Ïðè íaïèñaíèè ïðîãðaìì ÷añòî âîçíèêaåò ïîòðåáíîñòü îïðåäåëèòü íåñêîëüêî èìåíîâaííûõ êîíñòaíò, äëя êîòîðûõ òðåáóåòñя, ÷òîáû âñå îíè èìåëè ðaçëè÷íûå çía÷åíèя (ïðè ýòîì êîíêðåòíûå çía÷åíèя ìîãóò áûòü íå âaæíû). Äëя ýòîãî óäîá- íî âîñïîëüçîâaòüñя ïåðå÷èñëяåìûì òèïîì äaííûõ, âñå âîçìîæíûå çía÷åíèя êî- òîðîãî çaäaþòñя ñïèñêîì öåëî÷èñëåííûõ êîíñòaíò. Ôîðìaò:
enum [ èìя_òèï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÷åíèå, ÷åì ïðåäûäóùåé:
enum Err {ERR_READ, ERR_WRITE, ERR_CONVERT};
Err errOr;
…
switCh (errOr){
Case ERR_READ: /* îïåðaòîðû */ break; Case ERR_WRITE: /* îïåðaòîðû */ break; Case ERR_CONVERT: /* îïåðaòîðû */ break;
}
Êîíñòaíòaì ERR_READ, ERR_WRITE, ERR_CONVERT ïðèñâaèâaþòñя çía÷åíèя 0, 1 è 2 ñîîò- âåòñòâåííî.
Äðóãîé ïðèìåð:
enum {twO = 2, three, fOur, ten = 10, eleven, fifty = ten + 40};
Êîíñòaíòaì three è fOur ïðèñâaèâaþòñя çía÷åíèя 3 è 4, êîíñòaíòå eleven — 11.
Èìåía ïåðå÷èñëяåìûõ êîíñòaíò äîëæíû áûòü óíèêaëüíûìè, a çía÷åíèя ìîãóò ñîâïaäaòü. Ïðåèìóùåñòâî ïðèìåíåíèя ïåðå÷èñëåíèя ïåðåä îïèñaíèåì èìåíî- âaííûõ êîíñòaíò è äèðåêòèâîé define (ñì. ðaçäåë «Äèðåêòèâa #define», ñ. 94) ñî- ñòîèò â òîì, ÷òî ñâяçaííûå êîíñòaíòû íaãëяäíåå; êðîìå òîãî, êîìïèëяòîð ïðè èíèöèaëèçaöèè êîíñòaíò ìîæåò âûïîëíяòü ïðîâåðêó òèïîâ.
Ïðè âûïîëíåíèè aðèôìåòè÷åñêèõ îïåðaöèé ïåðå÷èñëåíèя ïðåîáðaçóþòñя â öå- ëûå. Ïîñêîëüêó ïåðå÷èñëåíèя яâëяþòñя òèïaìè, îïðåäåëяåìûìè ïîëüçîâaòåëåì, äëя íèõ ìîæíî ââîäèòü ñîáñòâåííûå îïåðaöèè (ñì. «Ïåðåãðóçêa îïåðaöèé», ñ. 189).
ПРИМЕЧАНИЕ
Äèaïaçîí çía÷åíèé ïåðå÷èñëåíèя îïðåäåëяåòñя êîëè÷åñòâîì áèò, íåîáõîäèìûì äëя ïðåä- ñòaâëåíèя âñåõ åãî çía÷åíèé. Ëþáîå çía÷åíèå öåëî÷èñëåííîãî òèïa ìîæíî яâíî ïðèâåñòè ê òèïó ïåðå÷èñëåíèя, íî ïðè âûõîäå ça ïðåäåëû åãî äèaïaçîía ðåçóëüòaò íå îïðåäåëåí.
Do'stlaringiz bilan baham: |