1 Структурные типы данных

advertisement
1
1.1
Ñòðóêòóðíûå òèïû äàííûõ
Îáúÿâëåíèå è îïðåäåëåíèå
Êàê è â Pascal, â C++ èìåþòñÿ ñòðóêòóðíûå òèïû äàííûõ èëè êðàòêî ñòðóêòóðû. Îäíàêî, ñèíòàêñèñ èõ îïèñàíèÿ îòëè÷àåòñÿ îò ïðèíÿòîãî â Pascal. Êàê è äëÿ ïåðåìåííûõ èëè ôóíêöèé, ñóùåñòâóþò îáúÿâëåíèÿ è îïðåäåëåíèÿ
ñòðóêòóð. Îáúÿâëåíèå ñòðóêòóðíîãî òèïà äàííûõ âûãëÿäèò ñëåäóþùèì îáðàçîì:
struct èìÿ;
Ýòîãî äîñòàòî÷íî òîëüêî äëÿ îáúÿâëåíèÿ óêàçàòåëåé íà äàííûé ñòðóêòóðíûé òèï. Äëÿ òîãî, ÷òîáû îïðåäåëÿòü ïåðåìåííûå äàííîãî ñòðóêòóðíîãî òèïà, íóæíî åãî îïðåäåëåíèå, êîòîðîå âûãëÿäèò òàê:
struct èìÿ { òåëî } ïåðåìåííûå;
Çäåñü òåëî ìîæåò ñîäåðæàòü ñëåäóþùèå ýëåìåíòû:
1) îïðåäåëåíèÿ ïîëåé, â òîì ÷èñëå áèòîâûõ. Îïðåäåëåíèå ïîëÿ âûãëÿäèò êàê îáû÷íàÿ äåêëàðàöèÿ ïåðåìåííîé, íî
áåç èíèöèàëèçàöèè. Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà îïèñûâàåò êîìïëåêñíîå ÷èñëî:
struct complex { double re, im; };
Áèòîâûå ïîëÿ ýòî ïîëÿ, õðàíÿùèå öåëîå ÷èñëî (çíàêîâîå èëè íåò) è çàíèìàþùèå óêàçàííîå ÷èñëî áèòîâ. Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà èìååò òðè áèòîâûõ ïîëÿ, êàæäîå èç êîòîðûõ çàíèìàåò äâà áèòà; ïîñêîëüêó îíè áåççíàêîâûå
(äëÿ çíàêîâûõ íàäî ïèñàòü int), äèàïàçîí çíà÷åíèé êàæäîãî èç íèõ îò 0 äî 3:
struct bitfields { unsigned a:2, b:2, c:2; };
Áèòîâûå ïîëÿ, ÷àùå âñåãî, èñïîëüçóþòñÿ äëÿ ýêîíîìèè ïàìÿòè. Èñïîëüçóÿ áèòîâûå ïîëÿ, â îäíîì áàéòå ìîæíî õðàíèòü 8 ëîãè÷åñêèõ ïåðåìåííûõ, òîãäà êàê åñëè êàæäóþ èç íèõ îïðåäåëÿòü ñ òèïîì bool, îíè â ñîâîêóïíîñòè çàéìóò 8
áàéòîâ. Òàêæå áèòîâûå ïîëÿ èñïîëüçóþòñÿ äëÿ ïðîãðàììèîâàíèÿ àïïàðàòóðû íà íèçêîì óðîâíå (íà óðîâíå ðåãèñòðîâ),
ïîñêîëüêó îäèí ðåãèñòð, õðàíÿùèé íåáîëüøîå öåëîå ÷èñëî, ìîæåò äåëèòüñÿ íà íåêîòîðîå ÷èñëî ïîëåé, óïðàâëÿþùèõ
íåçàâèñèìûìè ôóíêöèÿìè àïïàðàòóðû.  ýòîì ñëó÷àå ìîæåò âîçíèêíóòü ïîòðåáíîñòü ïðîïóñòèòü íåêîòîðîå ÷èñëî
áèòîâ ìåæäó ñîñåäíèìè áèòîâûìè ïîëÿìè; äëÿ ýòîãî ìîæíî âîñïîëüçîâàòüñÿ áåçûìÿííûì áèòîâûì ïîëåì, îïðåäåëÿåìûì òàêæå, êàê è îáû÷íîå, íî áåç èìåíè:
struct bitfields { unsigned a:2, :3, c:2; };
Çäåñü ìåæäó a è c áóäóò ïðîïóùåíû 3 áèòà.
Áèòîâûì ïîëÿì ìîæíî ïðèñâàèâàòü çíà÷åíèÿ èëè èñïîëüçîâàòü èõ çíà÷åíèÿ â âûðàæåíèÿõ. Îäíàêî, ïðèìåíÿòü ê
íèì îïåðàöèþ âçÿòèÿ àäðåñà & íåëüçÿ, ïîñêîëüêó ó áèòîâîãî ïîëÿ, âîîáùå ãîâîðÿ, íåò ñâîåãî àäðåñà: àäðåñ èìååòñÿ
òîëüêî ó âñåé ÿ÷åéêè öåëèêîì, à íå ó åå ÷àñòåé.
Êðîìå îáû÷íûõ è áèòîâûõ ïîëåé, èìåþòñÿ åùå ñòàòè÷åñêèå ïîëÿ. Ñòàòè÷åñêîå ïîëå, â îòëè÷èå îò îáû÷íîãî, êîïèÿ
êîòîðîãî èìååòñÿ â êàæäîé ñòðóêòóðíîé ïåðåìåííîé äàííîãî òèïà, ñóùåñòâóåò â åäèíñòâåííîì ýêçåìïëÿðå äëÿ âñåõ
ïåðåìåííûõ äàííîãî òèïà, è ñîîòâåòñòâóþùèå âûðàæåíèÿ äîñòóïà ê ýòîìó ïîëþ äëÿ âñåõ ïåðåìåííûõ ñèíîíèìû.
Ñòàòè÷åñêèå ïîëÿ, êðîìå ñâîåãî îïðåäåëåíèÿ â ñòðóêòóðå, äîëæíû åùå áûòü îáúÿâëåíû êàê îáû÷íûå ãëîáàëüíûå
ïåðåìåííûå; ïðè òàêîì îáúÿâëåíèè ýòî ïîëå ìîæåò áûòü èíèöèàëèçèðîâàíî. Êðîìå òîãî, äîñòóï ê íèì âîçìîæåí íå
òîëüêî ÷åðåç ïåðåìåííóþ ñòðóêòóðíîãî òèïà, íî è ÷åðåç ñàì òèï. Èñïîëüçóþòñÿ òàêèå ïîëÿ â îñíîâíîì äëÿ òîãî,
÷òîáû õðàíèòü èíôîðìàöèþ îáîáùàþùåãî õàðàêòåðà îáî âñåõ ïåðåìåííûõ äàííîãî òèïà. Íàïðèìåð, â òàêîì ïîëå
ìîæíî õðàíèòü ÷èñëî âñåõ ñóùåñòâóþùèõ â ïðîãðàììå ïåðåìåííûõ äàííîãî òèïà è èñïîëüçîâàòü åãî äëÿ òîãî, ÷òîáû
ñíàáäèòü êàæäóþ òàêóþ ïåðåìåííóþ ¾ñåðèéíûì íîìåðîì¿.
 êà÷åñòâå ïðèìåðà ðàññìîòðèì ñòðóêòóðíûé òèï äàííûõ, â êîòîðîì èñïîëüçóåòñÿ ñòàòè÷åñêîå ïîëå.
struct stfields
{
int a;
static int b;
} x, y;
int stfields::b = 7;
Çäåñü ìû îïðåäåëÿåì ñòðóêòóðíûé òèï äàííûõ, â êîòîðîì äâà ïîëÿ. Îäíî ïîëå, a, îáû÷íîå, à äðóãîå, b, ñòàòè÷åñêîå. Çäåñü æå îïðåäåëÿþòñÿ äâå ïåðåìåííûå òàêîãî ñòðóêòóðíîãî òèïà. Òàê âîò, ïîëå a ó êàæäîé èç ýòèõ ïåðåìåííûõ
ñâîå, è x.a è y.a äâå ðàçíûõ öåëûõ ïåðåìåííûõ; à ïîëå b ó âñåõ ïåðåìåííûõ òèïà stelds îáùåå, è êðîìå x.b è
y.b ó íåãî åñòü åùå îäèí ñèíîíèì stelds::b, êîòîðûé è èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ ýòîãî ïîëÿ êàê ãëîáàëüíîé
ïåðåìåííîé.
2) Îáúÿâëåíèÿ è îïðåäåëåíèÿ ìåòîäîâ. Ñèíòàêñèñ ó ýòèõ ýëåìåíòîâ ñòðóêòóðíîãî òèïà äàííûõ òàêîé æå, êàê è
ó îáúÿâëåíèé è îïðåäåëåíèé îáû÷íûõ ôóíêöèé. Îäíàêî, òîò ôàêò, ÷òî ýòè îáúÿâëåíèÿ èëè îïðåäåëåíèÿ ôóíêöèé
íàõîäÿòñÿ âíóòðè ñòðóêòóðû, àâòîìàòè÷åñêè îçíà÷àåò, ÷òî ýòî ìåòîäû. Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà èìååò ìåòîä,
âûâîäÿùèé åäèíñòâåííîå ïîëå ïåðåìåííîé äàííîãî òèïà íà ýêðàí:
struct sout
{
int a;
void print() { cout<<a; }
} x, y;
 îòëè÷èå îò Pascal, òåëà ìåòîäîâ ìîãóò áûòü íàïèñàíû âíóòðè îïèñàíèÿ ñòðóêòóðû; â ýòîì ñëó÷àå òàêèå ìåòîäû
àâòîìàòè÷åñêè ñ÷èòàþòñÿ ïîäñòàâëÿåìûìè ôóíêöèÿìè (êàê åñëè áû áûëî óêàçàíî êëþ÷åâîå ñëîâî inline ñì. ôàéë
ïðî ôóíêöèè). Îäíàêî, ìîæíî ïîñòóïàòü è êàê â Pascal âíóòðè ñòðóêòóðû ðàçìåùàþòñÿ îáúÿâëåíèÿ ìåòîäîâ, à
îïðåäåëåíèÿ ñíàðóæè. Â òàêîì ñòèëå îïðåäåëåíèå ïðåäûäóùåé ñòðóêòóðû áóäåò âûãëÿäåòü òàê:
struct sout
{
int a;
void print();
} x, y;
void sout::print() { cout<<a; }
 ýòîì ñëó÷àå, ïðè èñïîëüçîâàíèè ðàçäåëüíîé êîìïèëÿöèè, îïðåäåëåíèå ìåòîäà, êàê è ëþáîé äðóãîé ôóíêöèè, äîëæíî
âñòðå÷àòüñÿ òîëüêî â îäíîì èñõîäíîì ôàéëå.
Êàê è â Pascal, ìåòîäû âûçûâàþòñÿ ñ óêàçàíèåì îáúåêòà; ñèíòàêñèñ âûçîâà ìåòîäà â C++ î÷åíü ïîõîæ íà ïðèíÿòûé
â Pascal. Äëÿ ïðåäûäóùåé ñòðóêòóðû âûçîâ ìåòîäà print äëÿ ïåðåìåííîé x áóäåò âûãëÿäåòü òàê: x.print(). Êàê è â
Pascal, âíóòðè ìåòîäîâ ìîæíî èñïîëüçîâàòü ïîëÿ è ìåòîäû äàííîãî ñòðóêòóðíîãî òèïà áåç óêàçàíèÿ îáúåêòà; îíè
àâòîìàòè÷åñêè áóäóò îòíîñèòüñÿ ê òîìó îáúåêòó, äëÿ êîòîðîãî âûçâàí ìåòîä. Êðîìå òîãî, âíóòðè ìåòîäà ìîæíî
ïîëó÷èòü óêàçàòåëü íà òîò îáúåêò, äëÿ êîòîðîãî ìåòîä âûçâàí; â C++ ýòîò óêàçàòåëü íàçûâàåòñÿ this (â Pascal îáúåêò,
äëÿ êîòîðîãî âûçâàí ìåòîä, íàçûâàåòñÿ self). Èñïîëüçóÿ ýòîò óêàçàòåëü ÿâíî, ìîæíî ïåðåïèñàòü îïðåäåëåíèå ìåòîäà
print ñëåäóþùèì îáðàçîì:
void sout::print() { cout<<(*this).a; }
Êàê è îáû÷íûå ôóíêöèè, ìåòîäû ìîãóò áûòü ïåðåãðóæåíû, ò. å. âïîëíå çàêîííî èìåòü äâà ìåòîäà ñ îäèíàêîâûìè
èìåíàìè, ðàçëè÷àþùèåñÿ íàáîðîì òèïîâ ïàðàìåòðîâ.
Êàê è ïîëÿ, ìåòîäû òîæå áûâàþò ñòàòè÷åñêèìè. Òàêèå ìåòîäû íå èìåþò óêàçàòåëÿ this, â íèõ íåëüçÿ ïîëüçîâàòüñÿ
íåñòàòè÷åñêèìè ïîëÿìè è ìåòîäàìè áåç óêàçàíèÿ îáúåêòà, íî çàòî èõ ìîæíî âûçûâàòü íå òîëüêî ÷åðåç îáúåêò, íî è
÷åðåç òèï (ñèíòàêñèñ ïîõîæ íà èñïîëüçîâàíèå ñòàòè÷åñêèõ ïîëåé). Ñëåäóþùàÿ ñòðóêòóðà èìååò ñòàòè÷åñêèé ìåòîä
title, ïå÷àòàþùèé ñòðîêó ¾Hello, world!¿:
struct stmethod
{
static void title() { cout<<"Hello, world!"; }
} x, y;
Âûçâàòü ýòîò ìåòîä ìîæíî òàê: x.title(), à ìîæíî è òàê: stmethod::title().
Êàê è â Pascal, ñðåäè âñåõ ìåòîäîâ âûäåëÿþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû, îäíàêî ñèíòàêñèñ èõ îáúÿâëåíèé è
îïðåäåëåíèé ñèëüíî îòëè÷àåòñÿ îò ïðèíÿòîãî â Pascal.
Âî-ïåðâûõ, ó êîíñòðóêòîðîâ è äåñòðóêòîðîâ â ïðèíöèïå íåëüçÿ ïèñàòü òèï âîçâðàùàåìîãî çíà÷åíèÿ. Âî-âòîðûõ,
èìÿ êîíñòðóêòîðà âñåãäà äîëæíî ñîâïàäàòü ñ èìåíåì ñàìîãî ñòðóêòóðíîãî òèïà, à èìÿ äåñòðóêòîðà îòëè÷àòüñÿ
îò íåãî äîáàâëåíèåì òèëüäû (äà, îïåðàöèÿ áèòîâîãî îòðèöàíèÿ) ïåðåä íèì. Òàêæå, äåñòðóêòîð â ïðèíöèïå íå ìîæåò
èìåòü ïàðàìåòðîâ, õîòÿ ïèñàòü ïîñëå åãî èìåíè ïóñòûå êðóãëûå ñêîáêè íåîáõîäèìî. Âñå ýòî îçíà÷àåò, ñîãëàñíî ïðàâèëàì ïåðåãðóçêè ìåòîäîâ, ÷òî êîíñòðóêòîðîâ ìîæåò áûòü ìíîãî, íî ëþáûå äâà äîëæíû îòëè÷àòüñÿ íàáîðîì òèïîâ
ïàðàìåòðîâ, à äåñòðóêòîð è âîâñå ìîæåò áûòü òîëüêî îäèí.
Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà èìååò äâà êîíñòðóêòîðà è äåñòðóêòîð:
struct cd
{
int x;
cd(int s) { x = s; }
cd(char *s) { x = atoi(s); }
~cd() { cout<<"destructor"<<endl; }
};
Çäåñü áèáëèîòå÷íàÿ ôóíêöèÿ atoi (ôàéë cstdlib) ïðåîáðàçóåò ñòðîêó â ÷èñëî.
Ñåìàíòèêà êîíñòðóêòîðîâ è äåñòðóêòîðîâ â C++ òîæå ñèëüíî îòëè÷àåòñÿ îò ïðèíÿòîé â Pascal.  C++ êîíñòðóêòîðû è äåñòðóêòîðû âûçûâàþòñÿ àâòîìàòè÷åñêè ïðè ñîçäàíèè è óíè÷òîæåíèè ïåðåìåííûõ ñîîòâåòñòâåííî. Íàïðèìåð,
ñëåäóþùàÿ äåêëàðàöèÿ îïðåäåëÿåò ïåðåìåííóþ x òèïà cd è çàïèñûâàåò â åå ïîëå íà÷àëüíîå çíà÷åíèå 7:
cd x(7);
Òàêàÿ çàïèñü îçíà÷àåò, ÷òî íóæíî çàâåñòè ïåðåìåííóþ x òèïà cd è çàòåì âûçâàòü äëÿ íåå êîíñòðóêòîð ñ öåëûì
ïàðàìåòðîì, ðàâíûì 7. Òîãî æå ìîæíî äîáèòüñÿ, íàïèñàâ:
cd x("7");
íî çäåñü óæå áóäåò âûçâàí êîíñòðóêòîð ñ ïàðàìåòðîì òèïà ¾ñòðîêà¿. Òàêèì îáðàçîì ìîæíî ïðè îïðåäåëåíèè ïåðåìåííîé âûçâàòü ëþáîé êîíñòðóêòîð ñîîòâåòñòâóþùåãî ñòðóêòóðíîãî òèïà, íî êîíñòðóêòîðû ñ îäíèì ïàðàìåòðîì ìîãóò
áûòü âûçâàíû è èíà÷å:
cd x = 7;
Åñëè æå íàäî âûçâàòü êîíñòðóêòîð áåç ïàðàìåòðîâ (îí íàçûâàåòñÿ êîíñòðóêòîðîì ïî óìîë÷àíèþ), òî íå íóæíî ïèñàòü
íè÷åãî:
cd x;
Ó íàøåé ñòðóêòóðû, ïðàâäà, íåò êîíñòðóêòîðà ïî óìîë÷àíèþ, òàê ÷òî òàêàÿ äåêëàðàöèÿ âûçîâåò ñîîáùåíèå îá îøèáêå.
Ïèñàòü ïóñòûå ñêîáêè â ýòîì ñëó÷àå (âûçîâ êîíñòðóêòîðà áåç ïàðàìåòðîâ) íåëüçÿ êàòåãîðè÷åñêè, ïîñêîëüêó òàêàÿ
çàïèñü
cd x();
îçíà÷àåò ñîâñåì íå îïðåäåëåíèå ïåðåìåííîé, à ïðîòîòèï ôóíêöèè áåç ïàðàìåòðîâ, âîçâðàùàþùåé ïåðåìåííóþ òèïà
cd â êà÷åñòâå ðåçóëüòàòà.
 C++ ñðåäè âñåõ êîíñòðóêòîðîâ òàêæå âûäåëÿþòñÿ íåñêîëüêî ñïåöèàëüíûõ ñëó÷àåâ:
à) Êîíñòðóêòîð ïî óìîë÷àíèþ (áåç ïàðàìåòðîâ). Ñàìîå âàæíîå åãî ïðèìåíåíèå èíèöèàëèçàöèÿ ýëåìåíòîâ ìàññèâà, åñëè îíè èìåþò ñòðóêòóðíûé òèï, òàê ÷òî åñëè íåò êîíñòðóêòîðà ïî óìîë÷àíèþ, ñîçäàòü ìàññèâ èç ýëåìåíòîâ
òàêîãî ñòðóêòóðíîãî òèïà íåâîçìîæíî. Ïðàâäà, åñëè â ñòðóêòóðå íåò íèêàêîãî êîíñòðóêòîðà, òî êîìïèëÿòîð ñàì
ñòðîèò êîíñòðóêòîð ïî óìîë÷àíèþ. Òàêæå êîíñòðóêòîð ïî óìîë÷àíèþ èñïîëüçóåòñÿ, êîãäà íóæíî âûçâàòü êîíñòðóêòîð, íî â ïðîãðàììå ÿâíî íå óêàçàíî, êàêîé êîíñòðóêòîð äîëæåí áûòü âûçâàí (ñì. ðàçäåë ïðî êîìïîçèöèþ, à òàêæå
íàñëåäîâàíèå).
á) Êîíñòðóêòîð êîïèðîâàíèÿ. Ýòî êîíñòðóêòîð ñ îäíèì ïàðàìåòðîì, òèï êîòîðîãî ññûëêà íà (êîíñòàíòíûé èëè
íåò) ïåðåìåííóþ òîãî æå êëàññà. Ýòîò êîíñòðóêòîð, êàê è ëþáîé äðóãîé, ìîæåò áûòü âûçâàí ÿâíî ïðè ñîçäàíèè
ïåðåìåííîé ñòðóêòóðíîãî òèïà; òàêæå îí èñïîëüçóåòñÿ ïðè ïåðåäà÷å ïàðàìåòðîâ èëè âîçâðàòå ðåçóëüòàòà ôóíêöèè
ïî çíà÷åíèþ (êàê óæå ãîâîðèëîñü, ïåðåäà÷à ïàðàìåòðà ïî çíà÷åíèþ îçíà÷àåò, ÷òî â ôóíêöèè ìû èìååì äåëî ñ êîïèåé ôàêòè÷åñêîãî ïàðàìåòðà; òàê âîò, åñëè òèï ïàðàìåòðà ñòðóêòóðíûé, òî ýòà ñàìàÿ êîïèÿ ñòðîèòñÿ ïðè ïîìîùè
êîíñòðóêòîðà êîïèðîâàíèÿ. Òî æå ñàìîå ïðîèñõîäèò è ïðè âîçâðàòå ðåçóëüòàòà). Åñëè â ñòðóêòóðå íåò êîíñòðóêòîðà
êîïèðîâàíèÿ, îí ñòðîèòñÿ àâòîìàòè÷åñêè, èñõîäÿ èç êîíñòðóêòîðîâ êîïèðîâàíèÿ ïîëåé. Îäíàêî, äëÿ áîëüøèõ îáúåêòîâ
òàêîé êîíñòðóêòîð êîïèðîâàíèÿ íå ïîäõîäèò, ïîýòîìó íóæíî ðåàëèçîâàòü ñâîé ñîáñòâåííûé.
Îáñóäèì çäåñü, ÷òî òàêîå áîëüøèå è ìàëåíüêèå îáúåêòû (ïîä îáúåêòîì çäåñü è äàëåå ïîíèìàåòñÿ ïåðåìåííàÿ
ñòðóêòóðíîãî òèïà). Êîãäà ìû çàâîäèì ïåðåìåííóþ ñòðóêòóðíîãî òèïà, âûäåëÿåòñÿ íåêîòîðîå êîëè÷åñòâî ïàìÿòè,
äîñòàòî÷íîå äëÿ õðàíåíèÿ çíà÷åíèé âñåõ ïîëåé óêàçàííîãî ñòðóêòóðíîãî òèïà. Îäíàêî, èíîãäà áûâàåò òàê, ÷òî íå âåñü
îáúåêò ðàçìåùàåòñÿ â ýòîé ïàìÿòè. Îáúåêò ìîæåò ñîäåðæàòü ïîëÿ òèïà óêàçàòåëü, óêàçûâàþùèå íà äèíàìè÷åñêèå
ïåðåìåííûå èëè ìàññèâû-÷àñòè îáúåêòà, ðàñïîëîæåííûå ãäå-òî â äðóãîì ìåñòå ïàìÿòè. Òî, ÷òî ýòî ÷àñòè íàøåãî îáúåêòà, ìîæíî óçíàòü ïî òîìó, ÷òî îíè äîëæíû áûòü óíè÷òîæåíû âìåñòå ñ îáúåêòîì, êîãäà îí ñòàíîâèòñÿ íå íóæåí.
Òàêèå îáúåêòû, èìåþùèå âíåøíèå ¾÷àñòè¿, íàçûâàþòñÿ áîëüøèìè. Äëÿ òàêèõ îáúåêòîâ, êàê ïðàâèëî, ñòàíäàðòíûå
êîíñòðóêòîðû è äåñòðóêòîðû, ñîçäàâàåìûå êîìïèëÿòîðîì, íå ïîäõîäÿò. Îáúÿñíèì ýòî íà ïðèìåðå ïðîñòåéøåãî áîëüøîãî îáúåêòà, èìåþùåãî öåëîå ïîëå è ïîëå òèïà ¾óêàçàòåëü íà öåëîå¿, óêàçûâàþùåå íà âíåøíþþ äèíàìè÷åñêóþ
ïåðåìåííóþ öåëîãî òèïà.
struct Big
{
int x;
int *p;
Big();
Big(const Big &);
~Big();
};
Âî-ïåðâûõ, ïðè ñîçäàíèè ýòîãî îáúåêòà àâòîìàòè÷åñêè ïàìÿòü áóäåò âûäåëåíà òîëüêî ïîä x è p, íî íèêàê íå ïîä
òó äèíàìè÷åñêóþ ïåðåìåííóþ, íà êîòîðóþ äîëæåí óêàçûâàòü p. Äëÿ ïðàâèëüíîãî ñîçäàíèÿ îáúåêòà, ïîýòîìó, íóæíî
íàïèñàòü ñâîé êîíñòðóêòîð, îí áóäåò âûãëÿäåòü òàê:
Big::Big()
{
x = 0;
p = new int;
*p = 0;
}
Òåïåðü, ïðè ñîçäàíèè îáúåêòà ïàìÿòü âûäåëÿåòñÿ ïðàâèëüíî. Íî åñëè íå íàïèñàòü äåñòðóêòîð, ïàìÿòü ïîä äèíàìè÷åñêèå ïåðåìåííûå íèêîãäà íå áóäåò îñâîáîæäàòüñÿ, ÷òî ïðèâåäåò ê ÿâëåíèþ, êîòîðîå íàçûâàåòñÿ óòå÷êà ïàìÿòè. ×òîáû
ýòîãî íå ïðîèñõîäèëî, íóæíî ñîçäàòü è ñâîé ñîáñòâåííûé äåñòðóêòîð. Îí áóäåò âûãëÿäåòü òàê:
Big::~Big()
{
delete p;
}
Òåïåðü ïðè óíè÷òîæåíèè îáúåêòà âûäåëåííàÿ ïîä åãî âíåøíþþ ÷àñòü ïàìÿòü áóäåò ïðàâèëüíî îñâîáîæäåíà.
Íàêîíåö, ðàññìîòðèì, äëÿ ÷åãî íóæåí çäåñü êîíñòðóêòîð êîïèðîâàíèÿ. Åñëè åãî íåò, êîìïèëÿòîð ïîñòðîèò ñâîé
ñîáñòâåííûé êîíñòðóêòîð êîïèðîâàíèÿ, äåéñòâèå êîòîðîãî áóäåò ñîñòîÿòü â òîì, ÷òîáû ïðîñòî ïðèñâîèòü ïîëÿì êîïèè
çíà÷åíèÿ ïîëåé îðèãèíàëà.  èòîãå, åñëè îáúåêò áóäåò ñêîïèðîâàí, óêàçàòåëü p êîïèè áóäåò óêàçûâàòü íà òó æå
äèíàìè÷åñêóþ ïåðåìåííóþ, ÷òî è óêàçàòåëü p îðèãèíàëà. Íî åñëè îðèãèíàë ïî êàêèì-ëèáî ïðè÷èíàì áóäåò óíè÷òîæåí,
âìåñòå ñ íèì áóäåò óíè÷òîæåíà è òà äèíàìè÷åñêàÿ ïåðåìåííàÿ, íà êîòîðóþ óêàçûâàë åãî óêàçàòåëü p. Òàêèì îáðàçîì,
óêàçàòåëü p êîïèè áóäåò óêàçûâàòü íà îñâîáîæäåííóþ ïàìÿòü (òàêîé óêàçàòåëü íàçûâàåòñÿ âèñÿ÷èì), ÷òî íåïðàâèëüíî.
Òàêàÿ ñèòóàöèÿ èìååò ìåñòî, íàïðèìåð, â ñëåäóþùåì ôðàãìåíòå êîäà:
Big f()
{
Big x;
return x;
}
Ïîñêîëüêó ôóíêöèÿ f âîçâðàùàåò ðåçóëüòàò ïî çíà÷åíèþ, äëÿ ýòîãî èñïîëüçóåòñÿ êîíñòðóêòîð êîïèðîâàíèÿ, è â òîì
âûðàæåíèè, ãäå èñïîëüçóåòñÿ ðåçóëüòàò ôóíêöèè f, áóäåò ðåàëüíî èñïîëüçîâàíà êîïèÿ x; îäíàêî, îðèãèíàë, êàê è
âñÿêàÿ ëîêàëüíàÿ ïåðåìåííàÿ, áóäåò óíè÷òîæåí ïðè âûõîäå èç f.
Òàêàÿ ïðîáëåìà ðåøàåòñÿ ïóòåì ñîçäàíèÿ ñâîåãî ñîáñòâåííîãî êîíñòðóêòîðà êîïèðîâàíèÿ. Îí áóäåò âûãëÿäåòü
ñëåäóþùèì îáðàçîì:
Big::Big(const Big &ori)
{
x = ori.x;
p = new int;
*p = *ori.p;
}
â) Êîíñòðóêòîð ïðåîáðàçîâàíèÿ. Òàê íàçûâàåòñÿ ëþáîé êîíñòðóêòîð ñ îäíèì ïàðàìåòðîì, òèï êîòîðîãî îòëè÷àåòñÿ îò ñàìîãî ñòðóêòóðíîãî òèïà, êîíñòðóêòîðîì êîòîðîãî îí ÿâëÿåòñÿ. Íàçâàíèå ýòîé ðàçíîâèäíîñòè êîíñòðóêòîðîâ
îáúÿñíÿåòñÿ òåì, ÷òî ýòè êîíñòðóêòîðû èñïîëüçóþòñÿ äëÿ àâòîìàòè÷åñêîãî ïðåîáðàçîâàíèÿ òèïîâ òàì, ãäå ýòî íåîáõîäèìî. Íàïðèìåð, ó íàñ åñòü äâà ñòðóêòóðíûõ òèïà A è B, è â B åñòü êîíñòðóêòîð ñ åäèíñòâåííûì ïàðàìåòðîì òèïà A.
Òîãäà ìû ìîæåì ïîäñòàâèòü, ñêàæåì, ïåðåìåííóþ òèïà A â ôóíêöèþ, ó êîòîðîé åñòü ïàðàìåòð òèïà B. Êîìïèëÿòîð
ñàì ïîéìåò, ÷òî ïðè ýòîì íóæíî ñîçäàòü âðåìåííóþ ïåðåìåííóþ òèïà B ïðè ïîìîùè êîíñòðóêòîðà ïðåîáðàçîâàíèÿ
(åãî ïàðàìåòðîì áóäåò èñïîëüçîâàííîå íàìè â âûçîâå âûðàæåíèå òèïà A) è ïåðåäàòü ýòó ïåðåìåííóþ â èíòåðåñóþùóþ
íàñ ôóíêöèþ.
Íàïîñëåäîê â ðàçäåëå ïðî ìåòîäû îáñóäèì âîïðîñ, êîãäà â ñ++ âûçûâàþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû.
Èìååòñÿ ðÿä ñëó÷àåâ, êîãäà âûçûâàþòñÿ êîíñòðóêòîðû:
à) ïðè ñîçäàíèè ãëîáàëüíûõ ïåðåìåííûõ ñîîòâåòñòâóþùèå êîíñòðóêòîðû âûçûâàþòñÿ äî íà÷àëà ðàáîòû ôóíêöèè
main.
á) ïðè ñîçäàíèè ëîêàëüíûõ ñòàòè÷åñêèõ ïåðåìåííûõ ñîîòâåòñòâóþùèå êîíñòðóêòîðû âûçûâàþòñÿ îäèí ðàç çà âñå
âðåìÿ ðàáîòû ïðîãðàììû, êîãäà óïðàâëåíèå âïåðâûå äîñòèãàåò ñîîòâåòñòâóþùåé äåêëàðàöèè.
â) ïðè ñîçäàíèè îáû÷íûõ ëîêàëüíûõ ïåðåìåííûõ êîíñòðóêòîðû âûçûâàþòñÿ êàæäûé ðàç, êîãäà ñîçäàåòñÿ òàêàÿ
ïåðåìåííàÿ (ïðè êàæäîì âûçîâå, êîãäà óïðàâëåíèå äîñòèãàåò ñîîòâåòñòâóþùåé äåêëàðàöèè).
ã) ïðè ñîçäàíèè âðåìåííûõ áåçûìÿííûõ îáúåêòîâ. Â ñ++ ìîæíî ñîçäàòü âðåìåííûé áåçûìÿííûé îáúåêò ëþáîãî
ñòðóêòóðíîãî òèïà ïðè ïîìîùè ëþáîãî èç åãî êîíñòðóêòîðîâ. Ñèíòàêñèñ ýòîãî òàêîâ: èìÿ_òèïà(ïàðàìåòðû êîíñòðóêòîðà). Åñëè èñïîëüçóåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ, ïóñòûå ñêîáêè â äàííîì ñëó÷àå âñå ðàâíî îáÿçàòåëüíû. Íàïðèìåð, åñëè ó íàñ åñòü òèï Complex, õðàíÿùèé êîìïëåêñíîå ÷èñëî, è ó íåãî åñòü êîíñòðóêòîð ïî äâóì âåùåñòâåííûì
÷èñëàì (âåùåñòâåííàÿ è ìíèìàÿ ÷àñòü), òî â ïðîãðàììå ìîæíî èñïîëüçîâàòü âûðàæåíèå Complex(1.0, 2.0) âìåñòî
÷èñëà 1+2i.
ä) ïðè ñîçäàíèè äèíàìè÷åñêèõ îáúåêòîâ ïîñëå âûäåëåíèÿ ïàìÿòè ïîä ïîëÿ ñîîòâåòñòâóþùåé ïåðåìåííîé. Åñëè
â îïåðàöèè new ïðîñòî óêàçàí ñòðóêòóðíûé òèï, èñïîëüçóåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ, íî ìîæíî ïîñëå òèïà
ïîñòàâèòü ñêîáêè è â íèõ óêàçàòü ïàðàìåòðû êîíñòðóêòîðà òîãäà áóäåò âûçâàí ñîîòâåòñòâóþùèé êîíñòðóêòîð. Íàïðèìåð, â êîíòåêñòå ïðåäûäóùåãî ïóíêòà âûðàæåíèå new Complex(1.0, 2.0) ñîçäàåò íîâóþ äèíàìè÷åñêóþ ïåðåìåííóþ
òèïà Complex, âûçûâàåò äëÿ íåå êîíñòðóêòîð ïî äâóì âåùåñòâåííûì ÷èñëàì ñ ïàðàìåòðàìè 1 è 2, è âîçâðàùàåò
óêàçàòåëü íà íåå.
å) ïðè ñîçäàíèè ìàññèâà èç ýëåìåíòîâ ñòðóêòóðíîãî òèïà âûçûâàåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ äëÿ âñåõ åãî
ýëåìåíòîâ.
Äåñòðóêòîðû âûçûâàþòñÿ äëÿ óíè÷òîæåíèÿ îáúåêòîâ, ñîçäàííûõ ïðè ïîìîùè êîíñòðóêòîðîâ, â çàâèñèìîñòè îò
âðåìåíè æèçíè òîãî èëè èíîãî îáúåêòà. Íàïðèìåð, äëÿ îáû÷íûõ ëîêàëüíûõ ïåðåìåííûõ äåñòðóêòîð âûçûâàåòñÿ íåïîñðåäñòâåííî ïåðåä âûõîäîì èç ôóíêöèè, äëÿ ãëîáàëüíûõ ïåðåìåííûõ ïîñëå çàâåðøåíèÿ ðàáîòû ôóíêöèè main, äëÿ
äèíàìè÷åñêèõ ïåðåìåííûõ ïðè óíè÷òîæåíèè èõ îïåðàöèåé delete, íåïîñðåäñòâåííî ïåðåä îñâîáîæäåíèåì çàíèìàåìîé èìè ïàìÿòè.
3) Òàêæå âíóòðè ñòðóêòóðû ìîãóò âñòðå÷àòüñÿ îïðåäåëåíèÿ èëè typedef-ñèíîíèìû òèïîâ. Ýòî íóæíî äëÿ èñïîëüçîâàíèÿ òåõíîëîãèè îáîáùåííîãî ïðîãðàììèðîâàíèÿ, êîòîðàÿ áóäåò ðàññìîòðåíà ïîçæå.
1.2
Èñïîëüçîâàíèå ñòðóêòóðíûõ òèïîâ
Îïðåäåëèâ ñòðóêòóðíûé òèï äàííûõ, åãî ìîæíî èñïîëüçîâàòü äëÿ îïðåäåëåíèÿ ïåðåìåííûõ, óêàçàòåëåé, ìàññèâîâ è
ò. ä. òàê, êàê åñëè áû ýòî áûë îäèí èç âñòðîåííûõ òèïîâ âðîäå int èëè double. Ïðè ýòîì äîñòóï ê ïîëÿì èëè ìåòîäàì
î÷åíü ïîõîæ ïî ñèíòàêñèñó íà àíàëîãè÷íûé äîñòóï â Pascal. Íåìíîãèå îòëè÷èÿ ñîñòîÿò â ñëåäóþùåì: â C++ íåò
àíàëîãà îïåðàòîðà with, è äàæå åñëè ìåòîä íå èìååò ïàðàìåòðîâ, òî ïðè âûçîâå åãî â C++ âñå ðàâíî íàäî ïèñàòü
ïóñòûå êðóãëûå ñêîáêè.
Êðîìå òîãî, â C++ èìååòñÿ óäîáíàÿ îïåðàöèÿ äëÿ äîñòóïà ê ïîëþ èëè ìåòîäó òîé ñòðóêòóðû, íà êîòîðóþ óêàçûâàåò
óêàçàòåëü. Åñëè p óêàçàòåëü íà ñòðóêòóðó, à f ïîëå ýòîé ñòðóêòóðû, òî âûðàæåíèå p->f îçíà÷àåò ïîëå f òîé
ïåðåìåííîé, íà êîòîðóþ óêàçûâàåò p.
1.3
Ïðàâà äîñòóïà
 C++ ñóùåñòâóåò ìåõàíèçì îãðàíè÷åíèÿ äîñòóïà ê ïîëÿì è ìåòîäàì ñòðóêòóðíûõ òèïîâ äàííûõ.  ñâÿçè ñ ýòèì
ñóùåñòâóþò äâà (íà ñàìîì äåëå òðè, íî îá ýòîì ïîçæå êîãäà ðå÷ü ïîéäåò î íàñëåäîâàíèè) óðîâíÿ äîñòóïà ê ïîëÿì
è ìåòîäàì. Ïåðâûé óðîâåíü äîñòóïà íàçûâàåòñÿ public. Ïðèíàäëåæàùèå åìó ïîëÿ è ìåòîäû îòêðûòû, ò. å. äîñòóï ê
íèì âîçìîæåí èç ëþáîé ôóíêöèè ïðîãðàììû. Äðóãîé óðîâåíü äîñòóïà íàçûâàåòñÿ private; ïðèíàäëåæàùèå åìó ïîëÿ
è ìåòîäû äîñòóïíû òîëüêî èç ìåòîäîâ äàííîãî êëàññà.
 ñòðóêòóðå ïî óìîë÷àíèþ âñå ïîëÿ è ìåòîäû ÿâëÿþòñÿ îòêðûòûìè; åñëè íóæíî, ÷òîáû êàêèå-òî èç íèõ áûëè çàêðûòûìè, íóæíî ïåðåä íèìè íàïèñàòü private: (äâîåòî÷èå òîæå íóæíî ïèñàòü; ýòîò óðîâåíü äîñòóïà áóäåò äåéñòâîâàòü
íà âñå ïîñëåäóþùèå îáúÿâëåíèÿ è îïðåäåëåíèÿ ïîëåé è ìåòîäîâ, äî òåõ ïîð, ïîêà ÿâíî íå âñòðåòèòñÿ public:).
Èìååòñÿ è äðóãîå êëþ÷åâîå ñëîâî äëÿ îïðåäåëåíèÿ ñòðóêòóðíûõ òèïîâ äàííûõ, class. Îòëè÷èå åãî îò struct òîëüêî
â òîì, ÷òî îíî îçíà÷àåò ïî óìîë÷àíèþ ðåæèì äîñòóïà private.
Èíîãäà ïî ñîîáðàæåíèÿì ýôôåêòèâíîñòè òðåáóåòñÿ îòêðûòü äîñòóï äàæå ê çàêðûòûì ïîëÿì è ìåòîäàì êëàññà äëÿ
íåêîòîðîé ôóíêöèè èëè äàæå äëÿ âñåõ ìåòîäîâ íåêîòîðîãî äðóãîãî êëàññà. Äëÿ ýòîãî ñóùåñòâóåò ïîíÿòèå äðóæáû.
Ôóíêöèÿ ÿâëÿåòñÿ äðóãîì êëàññà, åñëè îíà èìååò äîñòóï êî âñåì åãî ïîëÿì è ìåòîäàì, äàæå ê çàêðûòûì. Âñå äðóæåñòâåííûå êëàññó ôóíêöèè äîëæíû áûòü ÿâíî óêàçàíû âíóòðè åãî îïðåäåëåíèÿ, ò. å. âíóòðè êëàññà äîëæíû áûòü
ïåðå÷èñëåíû ïðîòîòèïû äðóæåñòâåííûõ åìó ôóíêöèé, ïåðåä êàæäûì èç êîòîðûõ äîëæíî ñòîÿòü êëþ÷åâîå ñëîâî
friend. Òàêæå îáñòîèò äåëî è ñ êëàññàìè: êàæäûé äðóæåñòâåííûé êëàññ äëÿ êëàññà A, ò. å. òàêîé, âñå ìåòîäû êîòîðîãî
èìåþò äîñòóï êî âñåì ïîëÿì è ìåòîäàì êëàññà A, äîëæåí áûòü îáúÿâëåí âíóòðè A ñ êëþ÷åâûì ñëîâîì friend ñïåðåäè.
Âàæíîå çàìå÷àíèå: â C++ íåò íèêàêîé íåÿâíîé äðóæáû, ò. å. îòíîøåíèå äðóæáû ìåæäó êëàññàìè íå îáÿçàíî áûòü
íè ñèììåòðè÷íûì, íè òðàíçèòèâíûì.  ÷àñòíîñòè, åñëè êëàññ A äðóã êëàññà B, ýòî îòíþäü íå îçíà÷àåò, ÷òî B äðóã A.
Áîëåå òîãî, âëîæåííûå êëàññû, îïðåäåëåííûå âíóòðè äðóãèõ êëàññîâ, ñîâåðøåííî íå îáÿçàíû áûòü äðóçüÿìè ïîñëåäíèõ.
Íàïîñëåäîê â ýòîì ðàçäåëå ñêàæåì ïàðó ñëîâ î òîì, çà÷åì íóæíî îãðàíè÷åíèå ïðàâ äîñòóïà. Ýòîìó åñòü äâå
ãëàâíûõ ïðè÷èíû.
à) Âî-ïåðâûõ, ýòî ïîçâîëÿåò ãàðàíòèðîâàòü öåëîñòíîñòü äàííûõ. Åñëè ëþáàÿ ôóíêöèÿ ìîæåò çàïèñûâàòü ÷òî óãîäíî â ëþáûå ïîëÿ ñòðóêòóðíîé ïåðåìåííîé, î÷åâèäíî, íåëüçÿ íè÷åãî ãàðàíòèðîâàòü îòíîñèòåëüíî åå ñîñòîÿíèÿ. Åñëè
æå çàïèñûâàòü èíôîðìàöèþ â ïîëÿ ìîãóò òîëüêî ìåòîäû ñàìîãî êëàññà, îíè âïîëíå ìîãóò ïðîâåðÿòü ïðàâèëüíîñòü
ýòîé èíôîðìàöèè, è ïðèíèìàòü ìåðû ê èñïðàâëåíèþ ñèòóàöèè, åñëè èíôîðìàöèÿ, êîòîðóþ ìû ñîáèðàåìñÿ çàïèñàòü,
ïðàâèëüíîé íå ÿâëÿåòñÿ. Òèïè÷íûé ïðèìåð êëàññ, ñîäåðæàùèé äàòó. Åñëè â ýòîì êëàññå åñòü òðè öåëûõ ïîëÿ ãîä,
äåíü è ìåñÿö, òî äàëåêî íå ëþáîå ñî÷åòàíèå èç òðåõ öåëûõ ÷èñåë â ýòèõ ïîëÿõ ìîæíî ðàññìàòðèâàòü êàê ïðàâèëüíóþ
äàòó. Åñëè êòî óãîäíî ìîæåò çàïèñûâàòü â ýòè ïîëÿ ÷òî óãîäíî, íè÷åãî ãàðàíòèðîâàòü íåëüçÿ, íî åñëè ïîëÿ çàêðûòû
è åäèíñòâåííûì ìåòîäîì, ïðè ïîìîùè êîòîðîãî ìîæíî çàïèñàòü äàòó â ïåðåìåííóþ, áóäåò, ñêàæåì, ìåòîä setDate
ñ òðåìÿ öåëûìè ïàðàìåòðàìè, òî îí óæå èìååò ïîëíóþ âîçìîæíîñòü ïðîâåðèòü çàïèñûâàåìóþ â ïåðåìåííóþ äàòó
è ïðèíÿòü ìåðû, åñëè îíà íåïðàâèëüíàÿ (ðåàêöèÿ íà íåïðàâèëüíóþ äàòó ìîæåò áûòü ñàìîé ðàçíîé: îò èãíîðèðîâàíèÿ ïðîáëåìû, ò. å. ïðè ïîïûòêå çàïèñàòü íåïðàâèëüíóþ äàòó ïðîñòî çàïèñûâàåòñÿ êàêàÿ-òî çàðàíåå ôèêñèðîâàííàÿ
ïðàâèëüíàÿ äàòà è ïðîöåññ ïðîäîëæàåòñÿ êàê íè â ÷åì íå áûâàëî, äî âûäà÷è ñîîáùåíèÿ îá îøèáêå è àâàðèéíîãî
çàâåðøåíèÿ ïðîãðàììû).
á) Âî-âòîðûõ, ìû ìîæåì âïîñëåäñòâèè çàõîòåòü èçìåíèòü ðåàëèçàöèþ, ò. å. âíóòðåííåå óñòðîéñòâî íàøåãî êëàññà.
Åñëè âñå ïîëÿ è ìåòîäû íàøåãî êëàññà îòêðûòû è ëþáàÿ ôóíêöèÿ íàøåé ïðîãðàììû ìîæåò ïîëüçîâàòüñÿ ëþáûìè
èç íèõ, î÷åíü òðóäíî îòñëåäèòü âñå òå ìåñòà â ïðîãðàììå, â êîòîðûõ èñïîëüçóåòñÿ, íàïðèìåð, îïðåäåëåííîå ïîëå,
è êàê îíî òàì èñïîëüçóåòñÿ. Åñëè æå ïîëÿ çàêðûòû è ïîëüçîâàòåëÿì âèäíî ëèøü íåáîëüøîå ÷èñëî ìåòîäîâ, ìû
âîëüíû ìåíÿòü çàêðûòóþ ÷àñòü êëàññà êàê õîòèì (âñå ðàâíî îíà íå âèäíà íèêîìó, êðîìå íàøåãî êëàññà), ëèøü áû
îòêðûòûå ìåòîäû ïðè íîâîé ðåàëèçàöèè âåëè ñåáÿ ïî ñìûñëó òàêæå, êàê è ðàíüøå. Ïðîäîëæàÿ ïðèìåð ñ äàòîé, ìû
ìîæåì çàõîòåòü èçìåíèòü âíóòðåííåå ïðåäñòàâëåíèå äàòû ñ òðåõ öåëûõ ÷èñåë íà îäíî: íîìåð äíÿ, íà÷èíàÿ ñ êàêîé-òî
îïðåäåëåííîé äàòû. Åñëè ïîëÿ äàòû îòêðûòû, íàì íóæíî îòñëåæèâàòü è êîððåêòèðîâàòü âñå ìåñòà â ïðîãðàììå, ãäå
ýòè ïîëÿ èñïîëüçóþòñÿ, ÷òî ïðåäñòàâëÿåò ñîáîé î÷åíü ñëîæíóþ çàäà÷ó äëÿ áîëüøèõ ïðîãðàìì. Åñëè æå îíè çàêðûòû,
è êëèåíòû ìîãóò ïîëüçîâàòüñÿ òîëüêî ìåòîäàìè, ñêàæåì, setDate, getYear, getMonth, getDay, òî âñå, ÷òî íàì íóæíî
ñäåëàòü ïåðåïèñàòü íàø êëàññ òàê, ÷òîáû ýòè ìåòîäû âûäàâàëè (ïðè íîâîé ðåàëèçàöèè) ïðàâèëüíûå ðåçóëüòàòû.
1.4
Ïåðåãðóçêà îïåðàöèé
 C++ åñòü åùå îäíà î÷åíü óäîáíàÿ ÷åðòà, êîòîðàÿ íàçûâàåòñÿ ïåðåãðóçêîé îïåðàöèé. Ìû óæå âñòðå÷àëèñü ñ íåé,
êîãäà ãîâîðèëè, ÷òî äëÿ öåëûõ ÷èñåë îïåðàöèÿ << îçíà÷àåò áèòîâûé ñäâèã âëåâî, íî åñëè ëåâûé îïåðàíä ïîòîê
âûâîäà, òî òà æå ñàìàÿ îïåðàöèÿ îçíà÷àåò âûâîä èíôîðìàöèè â ïîòîê.
Îêàçûâàåòñÿ, â C++ ìîæíî ïåðåãðóæàòü íå òîëüêî ôóíêöèè, íî è ïî÷òè âñå îïåðàöèè, òàêèå, êàê ñëîæåíèå, âû÷èòàíèå è ò. ä. Ïðàâäà, îïðåäåëÿòü íîâûå âåðñèè ýòèõ îïåðàöèé ìîæíî òîëüêî äëÿ ïîëüçîâàòåëüñêèõ òèïîâ. Íàïðèìåð,
ïåðåîïðåäåëèòü ñëîæåíèå äëÿ öåëûõ èëè âåùåñòâåííûõ ÷èñåë íåëüçÿ.
Áîëüøèíñòâî îïåðàöèé ìîæíî ïåðåãðóæàòü äâóìÿ ñïîñîáàìè:
à) Êàê ìåòîä. Ïðèìåð äëÿ ñëîæåíèÿ êîìïëåêñíûõ ÷èñåë ïðèâîäèòñÿ íèæå:
class Complex
{
double x, y;
public:
Complex(double xx = 0, double yy = 0)
{
x = xx;
y = yy;
}
Complex operator+(Complex c);
};
Complex Complex::operator+(Complex c)
{
return Complex(x+c.x, y+c.y);
}
Çäåñü ó ñëîæåíèÿ âñåãî îäèí ïàðàìåòð, ïîòîìó ÷òî ïðè òàêîì ïåðåîïðåäåëåíèè ñëîæåíèÿ (êàê ìåòîä) ïåðâûì
ïàðàìåòðîì âñåãäà áóäåò òîò îáúåêò, äëÿ êîòîðîãî ýòîò ìåòîä âûçâàí, ò. å. åñëè ïåðåìåííûå z1 è z2 îïðåäåëåíû êàê
Complex, òî âûðàæåíèå z1+z2 ïîíèìàåòñÿ êîìïèëÿòîðîì êàê z1.operator+(z2). Â èòîãå, ïðè òàêîì ïåðåîïðåäåëåíèè
îïåðàöèé íóæíî â ñêîáêàõ óêàçûâàòü íà îäèí ïàðàìåòð ìåíüøå.
á) Êàê âíåøíþþ ôóíêöèþ. Òîò æå ïðèìåð â ýòîì ñëó÷àå áóäåò âûãëÿäåòü òàê:
class Complex
{
double x, y;
public:
Complex(double xx = 0, double yy = 0)
{
x = xx;
y = yy;
}
friend Complex operator+(Complex c1, Complex c2);
};
Complex operator+(Complex c1, Complex c2)
{
return Complex(c1.x+c2.x, c1.y+c2.y);
}
 ýòîì ñëó÷àå òî æå âûðàæåíèå z1+z2 òðàêòóåòñÿ óæå êàê operator+(z1, z2). Î÷åâèäíî, ÷òî íåëüçÿ ïåðåîïðåäåëÿòü
îäíó è òó æå ïî ñìûñëó îïåðàöèþ îáîèìè ñïîñîáàìè ñðàçó òîãäà êîìïèëÿòîð íå áóäåò çíàòü, êàê åå íóæíî âûçûâàòü.
1.5
Êîíñòàíòíûå îáúåêòû
C++ ïîçâîëÿåò èñïîëüçîâàòü êëþ÷åâîå ñëîâî const íå òîëüêî ñî âñòðîåííûìè òèïàìè, íî è ñ ïîëüçîâàòåëüñêèìè.
Ñìûñë ýòîãî â òîì, ÷òîáû åùå íà ýòàïå êîìïèëÿöèè îòëàâëèâàòü íåêîòîðûå îøèáêè.
Äîáàâëåíèå êëþ÷åâîãî ñëîâà const â äåêëàðàöèþ ïåðåìåííîé ñòðóêòóðíîãî òèïà ïðèâîäèò ê òîìó, ÷òî ó òàêîãî
îáúåêòà:
à) íåëüçÿ ïðèñâàèâàòü îòêðûòûì ïîëÿì çíà÷åíèÿ;
á) ìîæíî ïîëüçîâàòüñÿ òîëüêî êîíñòàíòíûìè, ò. å. íå ìåíÿþùèìè ñâîåãî îáúåêòà, ìåòîäàìè. Òàêèå ìåòîäû, âîïåðâûõ, â çàãîëîâêå ïîñëå ñïèñêà ïàðàìåòðîâ, ò. å. ìåæäó ) è ; èëè òåëîì äîëæíû èìåòü êëþ÷åâîå ñëîâî const,
è âî-âòîðûõ, íå äîëæíû ïûòàòüñÿ ïðèñâàèâàòü ïîëÿì çíà÷åíèÿ èëè âûçûâàòü äëÿ òîãî æå îáúåêòà íåêîíñòàíòíûå
ìåòîäû. Òàêèå ìåòîäû ïðîñòî ðàññìàòðèâàþòñÿ êàê ïðèíèìàþùèå íåÿâíûé ïàðàìåòð this òèïà íå ïðîñòî óêàçàòåëü
íà ñâîé êëàññ, à óêàçàòåëü íà êîíñòàíòó òèïà ýòîãî êëàññà. Ýòî ñîîáðàæåíèå ïîçâîëÿåò â ðàìêàõ îáû÷íûõ ïðàâèë
ïåðåãðóçêè ìåòîäîâ, è áîëåå îáùî, ôóíêöèé, èìåòü äâà ìåòîäà, îäèíàêîâûõ ïî èìåíè è òèïàì ïàðàìåòðîâ, îäèí èç
êîòîðûõ êîíñòàíòíûé, à äðóãîé íåò. Ýòî äîñòàòî÷íî óäîáíî ïðè ðåàëèçàöèè áèáëèîòå÷íûõ êëàññîâ.
Çàäà÷è.
1. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé ìîìåíò âðåìåíè. Ïðè ýòîì æåëàòåëüíî ãàðàíòèðîâàòü
ïðàâèëüíîñòü çàïèñàííîé â íåì èíôîðìàöèè (ïðè ïîìîùè çàêðûòèÿ ïîëåé).
2. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé îñòàòîê ïî ìîäóëþ NUMBER (êîíñòàíòà, îïðåäåëåííàÿ â
ïðîãðàììå). Äîëæåí áûòü ðåàëèçîâàí êîíñòðóêòîð ïî öåëîìó ÷èñëó è îïåðàöèè ñëîæåíèÿ, âû÷èòàíèÿ è óìíîæåíèÿ.
3. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé êîìïëåêñíîå ÷èñëî. Äîëæíû áûòü êîíñòðóêòîð ïî âåùåñòâåííîé è ìíèìîé ÷àñòè, àðèôìåòè÷åñêèå îïåðàöèè, ïåðåãðóæåííàÿ îïåðàöèÿ ! (êîìïëåêñíîå ñîïðÿæåíèå).
4. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé äðîáü (ïîëÿ ÷èñëèòåëü è çíàìåíàòåëü öåëûå ÷èñëà).
Äîëæíû áûòü êîíñòðóêòîð ïî öåëîìó ÷èñëó, ïî äâóì öåëûì ÷èñëàì, ìåòîä ñîêðàùåíèå äðîáè, àðèôìåòè÷åñêèå
îïåðàöèè è îïåðàöèè ñðàâíåíèÿ.
5. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé ìíîãî÷ëåí ñ âåùåñòâåííûìè êîýôôèöèåíòàìè (äàííûå
ñòåïåíü è äèíàìè÷åñêèé ìàññèâ êîýôôèöèåíòîâ). Äîëæåí áûòü êîíñòðóêòîð ïî âåùåñòâåííîìó ÷èñëó (êîíñòàíòà),
êîíñòðóêòîð ïî ñòåïåíè è ìàññèâó êîýôôèöèåíòîâ, êîíñòðóêòîð êîïèðîâàíèÿ, äåñòðóêòîð, ïåðåãðóæåííûå îïåðàöèè:
ïðèñâàèâàíèå, àðèôìåòè÷åñêèå îïåðàöèè, îïåðàöèÿ èíäåêñàöèè (âîçâðàùàåò ññûëêó íà êîýôôèöèåíò ïî ñòåïåíè îäíî÷ëåíà), îïåðàöèÿ () (ïàðàìåòð âåùåñòâåííîå ÷èñëî, ðåçóëüòàò çíà÷åíèå ìíîãî÷ëåíà â óêàçàííîé òî÷êå).
6. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé ìàòðèöó èç âåùåñòâåííûõ ÷èñåë. Äîëæåí áûòü êîíñòðóêòîð ïî ïàðå öåëûõ ÷èñåë è ìàññèâó âåùåñòâåííûõ (÷èñëî ñòðîê, ñòîëáöîâ è ýëåìåíòû), êîíñòðóêòîð êîïèðîâàíèÿ,
äåñòðóêòîð, ïåðåãðóæåííûå îïåðàöèè: ïðèñâàèâàíèå, àðèôìåòè÷åñêèå îïåðàöèè (êðîìå äåëåíèÿ), îïåðàöèÿ èíäåêñàöèè (âîçâðàùàåò ññûëêó íà êîýôôèöèåíò ïî íîìåðàì ñòðîêè è ñòîëáöà, êðóãëûå ñêîáêè, ïîòîìó ÷òî â êâàäðàòíûõ
äîïóñêàåòñÿ òîëüêî îäèí ïàðàìåòð), îïåðàöèÿ ! (òðàíñïîíèðîâàíèå), (îáðàòíàÿ ìàòðèöà), ìåòîä det (îïðåäåëèòåëü).
Download