ПРИМЕЧАНИЕ
Ïåðåãðóæaòü ìîæíî íå òîëüêî êîíñòðóêòîðû, íî è äðóãèå ìåòîäû êëañña.
Cóùåñòâóåò åùå îäèí ñïîñîá èíèöèaëèçaöèè ïîëåñ â nîíñòðónòîðå (êðîìå èñ- ïîëüçîâaííîãî â ïðèâåäåííîé âûøå ïðîãðaììå ïðèñâaèâaíèя ïîëяì çía÷åíèé ôîðìaëüíûõ ïaðaìåòðîâ) — ñ ïîìîùüþ ñïèñêa èíèöèaëèçaòîðîâ, ðañïîëîæåí- íûõ ïîñëå äâîåòî÷èя ìåæäó çaãîëîâêîì è òåëîì êîíñòðóêòîða:
mOnstr::mOnstr(int he, int am):
health (he), ammO (am), skin (red), name (0){}
Ïîëя ïåðå÷èñëяþòñя ÷åðåç çaïяòóþ. Äëя êaæäîãî ïîëя â ñêîáêaõ óêaçûâaåòñя èíèöèaëèçèðóþùåå çía÷åíèå, êîòîðîå ìîæåò áûòü âûðaæåíèåì. Áåç ýòîãî ñïîñî- áa íå îáîéòèñü ïðè èíèöèaëèçaöèè ïîëåñ-nîíñòaíò, ïîëåñ-ññûëîn è ïîëåñ-îáúån- òîâ.  ïîñëåäíåì ñëó÷aå áóäåò âûçâaí êîíñòðóêòîð, ñîîòâåòñòâóþùèé óêaçaí- íûì â ñêîáêaõ ïaðaìåòðaì.
ПРИМЕЧАНИЕ
Êîíñòðóêòîð íå ìîæåò âîçâðaòèòü çía÷åíèå, ÷òîáû ñîîáùèòü îá îøèáêå âî âðåìя èíèöèa- ëèçaöèè. Äëя ýòîãî ìîæíî èñïîëüçîâaòü ìåõaíèçì îáðaáîòêè èñêëþ÷èòåëüíûõ ñèòóaöèé (cì. ðaçäåë «Èñêëþ÷åíèя â êîíñòðóêòîðaõ è äåñòðóêòîðaõ», ñ. 228).
Конструктор копирования
Êîíñòðóêòîð êîïèðîâaíèя — ýòî ñïåöèaëüíûé âèä êîíñòðóêòîða, ïîëó÷aþùèé â êa÷åñòâå åäèíñòâåííîãî ïaðaìåòða ññûëêó ía îáúåêò ýòîãî æå êëañña:
T::T(const T&) { … /* Òåëî êîíñòðóêòîða */ }
ãäå T — èìя êëañña.
Ýòîò êîíñòðóêòîð âûçûâaåòñя â òåõ ñëó÷aяõ, êîãäa íîâûé îáúåêò ñîçäaåòñя ïóòåì êîïèðîâaíèя ñóùåñòâóþùåãî:
ïðè îïèñaíèè íîâîãî îáúåêòa ñ èíèöè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ïèøåì êîíñòðóêòîð êîïèðîâaíèя äëя êëañña mOnstr. Ïîñêîëüêó â íåì åñòü ïîëå name, ñîäåðæaùåå óêaçaòåëü ía ñòðîêó ñèìâîëîâ, êîíñòðóêòîð êîïèðîâaíèя äîë- æåí âûäåëяòü ïaìяòü ïîä íîâóþ ñòðîêó è êîïèðîâaòü â íåå èñõîäíóþ:
mOnstr::mOnstr(COnst mOnstr &M){ if (M.name){
name = new Char [strlen(M.name) + 1]; strCpy(name, M.name);}
else name = 0;
health = M.health; ammO = M.ammO; skin = M.skin;
}
…
mOnstr Vasia (blue);
mOnstr Super = Vasia; // Ðaáîòaåò êîíñòðóêòîð êîïèðîâaíèя mOnstr *m = new mOnstr ("Ork");
mOnstr Green = *m; // Ðaáîòaåò êîíñòðóêòîð êîïèðîâaíèя
ПРИМЕЧАНИЕ
Ëþáîé êîíñòðóêòîð êëaññ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íèå», ñ. 201.
Do'stlaringiz bilan baham: |