Còaòè÷åñêèå ìåòîäû ïðåäíaçía÷åíû äëя îáðaùåíèя ê ñòaòè÷åñêèì ïîëяì êëañña. Îíè ìîãóò îáðaùaòüñя íåïîñðåäñòâåííî òîëüêî ê ñòaòè÷åñêèì ïîëяì è âûçûâaòü òîëüêî äðóãèå ñòaòè÷åñêèå ìåòîäû êëañña, ïîòîìó ÷òî èì íå ïåðåäaåòñя ñêðûòûé óêaçaòåëü this. Îáðaùåíèå ê ñòaòè÷åñêèì ìåòîäaì ïðîèçâîäèòñя òaê æå, êaê ê ñòaòè÷åñêèì ïîëяì — ëèáî ÷åðåç èìя êëañña, ëèáî, åñëè õîòя áû îäèí îáúåêò êëañña óæå ñîçäaí, ÷åðåç èìя îáúåêòa.
Class A{
statiC int COunt; // Ïîëå COunt — ñêðûòîå publiC:
statiC vOid inC_COunt(){ COunt++; }
…
};
…
A::int COunt; // Îïðåäåëåíèå â ãëîáaëüíîé îáëañòè vOid f(){
A a;
// a.COunt++ — íåëüçя, ïîëå COunt ñêðûòîå
// Èçìåíåíèå ïîëя ñ ïîìîùüþ ñòaòè÷åñêîãî ìåòîäa: a.inC_COunt(); // èëè A::inC_COunt();
}
Còaòè÷åñêèå ìåòîäû íå ìîãóò áûòü êîíñòaíòíûìè (COnst) è âèðòóaëüíûìè (virtual).
Дружественные функции и классы
Èíîãä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 îáúåêòîâ (ñì. ñ. 284).
Íèæå ïåðå÷èñëåíû ïðaâèëa îïèñaíèя è îñîáåííîñòè äðóæåñòâåííûõ ôóíêöèé.
Äðóæåñòâåííaя ôóíêöèя îáúяâëяåòñя âíóòðè nëañña, ê ýëåìåíòaì êîòîðîãî åé íóæåí äîñòóï, ñ êëþ÷åâûì ñëîâîì friend.  êa÷åñòâå ïaðaìåòða åé äîëæåí ïåðåäaâaòüñя îáúåêò èëè ññûëêa ía îáúåêò êëañña, ïîñêîëüêó óêaçaòåëü this åé íå ïåðåäaåòñя.
Äðóæåñòâåííaя ôóíêöèя ìîæåò áûòü îáû÷íîé ôóíêöèåé èëè ìåòîäîì äðóãî- ãî ðaíåå îïðåäåëåííîãî êëañña. Ía íåå íå ðañïðîñòðaíяåòñя äåéñòâèå ñïåöè- ôèêaòîðîâ äîñòóïa, ìåñòî ðaçìåùåíèя åå îáúяâëåíèя â êëaññå áåçðaçëè÷íî.
Îäía ôóíêöèя ìîæåò áûòü äðóæåñòâåííîé ñðaçó íåñêîëüêèì êëaññaìè.
 êa÷åñòâå ïðèìåða íèæå ïðèâåäåíî îïèñaíèå äâóõ ôóíêöèé, äðóæåñòâåííûõ êëaññó mOnstr. Ôóíêöèя kill яâëяåòñя ìåòîäîì êëañña herO, a ôóíêöèя steal_ammO íå ïðèíaäëåæèò íè îäíîìó êëaññó. Îáåèì ôóíêöèяì â êa÷åñòâå ïaðaìåòða ïåðå- äaåòñя ññûëêa ía îáúåêò êëañña mOnstr.
Class mOnstr; // Ïðåäâaðèòåëüíîå îáúяâëåíèå êëañña Class herO{
publiC:
vOid kill(mOnstr &);
…
};
Class mOnstr{
…
friend int steal_ammO(mOnstr &); friend vOid herO::kill(mOnstr &);
// Êëaññ herO äîëzåí áûòü îïðåäåëåí ðaíåå
};
int steal_ammO(mOnstr &M){return --M.ammO;}
vOid herO::kill(mOnstr &M){M.health = 0; M.ammO = 0;}
Èñïîëüçîâaíèя äðóæåñòâåííûõ ôóíêöèé íóæíî ïî âîçìîæíîñòè èçáåãaòü, ïî- ñêîëüêó îíè íaðóøaþò ïðèíöèï èíêaïñóëяöèè è, òaêèì îáðaçîì, çaòðóäíяþò îò- ëaäêó è ìîäèôèêaöèþ ïðîãðaììû.
Do'stlaringiz bilan baham: |