Классы
 ýòîé ãë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ñña — ìåòîäaìè1. Ïîëя è ìåòîäû íaçûâaþòñя ýëåìåíòaìè nëañña. Îïèña- íèå êëañña â ïåðâîì ïðèáëèæåíèè âûãëяäèò òaê:
class <èìя>{
[ private: ]
<îïèñaíèå ñêðûòûõ ýëåìåíòîâ> public:
<îïèñaíèå äîñòóïíûõ ýëåìåíòîâ>
}; // Îïèñaíèå çaêaí÷èâaåòñя òî÷êîé ñ çaïяòîé
Cïåöèôèêaòîðû äîñòóïa private è publiC óïðaâëяþò âèäèìîñòüþ ýëåìåíòîâ êëañ- ña. Ýëåìåíòû, îïèñaííûå ïîñëå ñëóæåáíîãî ñëîâa private, âèäèìû òîëüêî âíóòðè êëañña. Ýòîò âèä äîñòóïa ïðèíяò â êëaññå ïî óìîë÷aíèþ. Èíòåðôåéñ êëañña îïè-
1  ëèòåðaòóðå ÷aùå âñòðå÷aþòñя òåðìèíû «äaííûå-÷ëåíû» è «ôóíêöèè-÷ëåíû», a òaêæå
«êîìïîíåíòíûå äaííûå» è «êîìïîíåíòíûå ôóíêöèè», íî ïî íåîáúяñíèìûì ïðè÷èíaì я ïðåäïî÷èòaþ «ïîëя» è «ìåòîäû».  òåõ ñëó÷aяõ, êîãäa èç êîíòåêñòa ïîíяòíî, ÷òî ðå÷ü èäåò î ôóíêöèяõ-÷ëåíaõ êëañña, a íå îá îáû÷íûõ ôóíêöèяõ, ìåòîäû íaçûâaþòñя ïðîñòî
«ôóíêöèяìè».
ñûâaåòñя ïîñëå ñïåöèôèêaòîða publiC. Äåéñòâèå ëþáîãî ñïåöèôèêaòîða ðañïðî- ñòðaíяåòñя äî ñëåäóþùåãî ñïåöèôèêaòîða èëè äî êîíöa êëañña. Ìîæíî çaäaâaòü íåñêîëüêî ñåêöèé private è publiC, ïîðяäîê èõ ñëåäîâaíèя çía÷åíèя íå èìååò.
Ïîëя nëañña:
ìîãóò èìåòü ëþáîé òèï, êðîìå òèïa ýòîãî æå êëañña (íî ìîãóò áûòü óêaçaòå- ëяìè èëè ññûëêaìè ía ýòîò êëaññ);
ìîãóò áûòü îïèñaíû ñ ìîäèôèêaòîðîì COnst, ïðè ýòîì îíè èíèöèaëèçèðóþò- ñя òîëüêî îäèí ðaç (ñ ïîìîùüþ êîíñòðóêòîða) è íå ìîãóò èçìåíяòüñя;
ìîãóò áûòü îïèñaíû ñ ìîäèôèêaòîðîì statiC (îá ýòîì ðaññêaçûâaåòñя â ðaç- äåëå «Còaòè÷åñêèå ïîëя», ñ. 186), íî íå êaê autO, extern è register.
Èíèöèaëèçaöèя ïîëåé ïðè îïèñaíèè íå äîïóñêaåòñя.
Êëaññû ìîãóò áûòü ãëîáaëüíûìè (îáúяâëåííûìè âíå ëþáîãî áëîêa) è ëînaëüíû- ìè (îáúяâëåííûìè âíóòðè áëîêa, íaïðèìåð, ôóíêöèè èëè äðóãîãî êëañña).
Íèæå ïåðå÷èñëåíû íåêîòîðûå îñîáåííîñòè ëîêaëüíîãî êëañña:
âíóòðè ëîêaëüíîãî êëañña ìîæíî èñïîëüçîâaòü òèïû, ñòaòè÷åñêèå (statiC) è âíåøíèå (extern) ïåðåìåííûå, âíåøíèå ôóíêöèè è ýëåìåíòû ïåðå÷èñëåíèé èç îáë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 ñîçäaäèì êëaññ, ìîäåëèðóþùèé ïåðñîíaæ êîìïüþòåðíîé èãðû. Äëя ýòîãî òðåáóåòñя çaäaòü åãî ñâîéñòâa (íaïðèìåð, êîëè÷åñòâî ùóïaëåö, ñèëó èëè íaëè÷èå ãðaíaòîìåòa) è ïîâåäåíèå. Åñòåñòâåííî, ïðèìåð áóäåò ñõåìaòè-
÷åí, ïîñêîëüêó ïðèâîäèòñя ëèøü äëя äåìîíñòðaöèè ñèíòaêñèña.
Class mOnstr{
int health, ammO; publiC:
mOnstr(int he = 100, int am = 10){ health = he; ammO = am;} vOid draw(int x, int y, int sCale, int pOsitiOn);
int get_health(){return health;} int get_ammO(){return ammO;}
};
 ýòîì êëaññå äâa ñêðûòûõ ïîëя — health è ammO, ïîëó÷èòü çía÷åíèя êîòîðûõ èç- âíå ìîæíî ñ ïîìîùüþ ìåòîäîâ get_health() è get_ammO(). Äîñòóï ê ïîëяì ñ ïîìî- ùüþ ìåòîäîâ â äaííîì ñëó÷aå êaæåòñя èñêóññòâåííûì óñëîæíåíèåì, íî íaäî ó÷èòûâaòü, ÷òî ïîëяìè ðåaëüíûõ êëaññîâ ìîãóò áûòü ñëîæíûå äèíaìè÷åñêèå ñòðóêòóðû, è ïîëó÷åíèå çía÷åíèé èõ ýëåìåíòîâ íå òaê òðèâèaëüíî. Êðîìå òîãî, î÷åíü âaæíîé яâëяåòñя âîçìîæíîñòü âíîñèòü â ýòè ñòðóêòóðû èçìåíåíèя, íå ça- òðaãèâaя èíòåðôåéñ êëañña.
Âñå ìåòîäû êëañña èìåþò íåïîñðåäñòâåííûé äîñòóï ê åãî ñêðûòûì ïîëяì, èíû- ìè ñëîâaìè, òåëa ôóíêöèé êëañña âõîäяò â îáëañòü âèäèìîñòè private ýëåìåíòîâ êëañña.
 ïðèâåäåííîì êëaññå ñîäåðæèòñя òðè îïðåäåëåíèя ìåòîäîâ è îäíî îáúяâëåíèå (ìåòîä draw). Åñëè òåëî ìåòîäa îïðåäåëåíî âíóòðè êëañña, îí яâëяåòñя âñòðîåí- íûì (inline). Êaê ïðaâèëî, âñòðîåííûìè äåëaþò êîðîòêèå ìåòîäû. Åñëè âíóòðè êëañña çaïèñaíî òîëüêî îáúяâëåíèå (çaãîëîâîê) ìåòîäa, ñaì ìåòîä äîëæåí áûòü îïðåäåëåí â äðóãîì ìåñòå ïðîãðaììû ñ ïîìîùüþ îïåðaöèè äîñòóïa ê îáëañòè âè- äèìîñòè (::):
vOid mOnstr::draw(int x, int y, int sCale, int pOsitiOn){
/* òåëî ìåòîäa */
}
Ìåòîä ìîæíî îïðåäåëèòü êaê âñòðîåííûé è âíå êëañña ñ ïîìîùüþ äèðåêòèâû
inline (êaê è äëя îáû÷íûõ ôóíêöèé, îía íîñèò ðåêîìåíäaòåëüíûé õaðaêòåð):
inline int mOnstr::get_ammO(){ return ammO;
}
 êaæäîì êëaññå åñòü õîòя áû îäèí ìåòîä, èìя êîòîðîãî ñîâïaäaåò ñ èìåíåì êëañ- ña. Îí íaçûâaåòñя nîíñòðónòîðîì è âûçûâaåòñя aâòîìaòè÷åñêè ïðè ñîçäaíèè îáúåêòa êëañña. Êîíñòðóêòîð ïðåäíaçía÷åí äëя èíèöèaëèçaöèè îáúåêòa. Àâòîìa- òè÷åñêèé âûçîâ êîíñòðóêòîða ïîçâîëяåò èçáåæaòü îøèáîê, ñâяçaííûõ ñ èñïîëü- çîâaíèåì íåèíèöèaëèçèðîâaííûõ ïåðåìåííûõ. Ìû ïîäðîáíî ðaññìîòðèì êîíñò- ðóêòîðû â ðaçäåëå «Êîíñòðóêòîðû», ñ. 182.
Òèïû äaííûõ struCt è uniOn яâëяþòñя âèäaìè êëañña, ðaçíèöa ìåæäó íèìè áóäåò îáúяñíåía ïîçæå, ía ñ. 210. Äðóãîé ïðèìåð îïèñaíèя êëañña, a òaêæå ïðèìåð ëî- êaëüíîãî êëañña ïðèâåäåí â ðaçäåëå «Cîçäaíèå øaáëîíîâ êëaññîâ» ía ñ. 211.
Do'stlaringiz bilan baham: |