Достас функциялар жəне кластар



Дата03.01.2022
өлшемі17.92 Kb.
#450328
4 дəріс Достас функциялар жəне кластар-netrefs.ru


Достас функциялар жəне кластар
Кейде кластың жасырын өрістеріне тікелей қол жеткізу мүмкіндігі болғаны, яғни класс интерфейсін кеңейткен жөн. Бұл үшін достас функциялар жəне достас кластар қызмет етеді.
Достас функциялар

Достас функциялар кластың жасырын өрістеріне қол жеткізу үшін қолданылады жəне олар əдістердің балама түрі (альтернативасы) болып саналады. Əдіс, көбінесе объектінің қасиеттерін жүзеге асыру үшін қолданылады, ал достас функциялар түрінде класс қасиеттерін көрсетпейтін, бірақ оның интерфейсіне концептуалды түрде енетін жəне оның жасырын өрістеріне қол жеткізуді қажет ететін əрекеттер қалыптастырылады, мысалы объектілерді экранға шығарудың қайта анықталған операциялары.

Төменде достас функцияларды сипаттау ережелері мен олардың ерекшеліктері көрсетілген.

  • Достас функция объектілеріне қол жеткізу қажет болатын класс ішінде friend түйінді сөзі арқылы жарияланады. Параметр ретінде оған объект немесе класс объектісіне сілтеме берілуі керек, өйткені оған this нұсқауышы берілмейді.


  • Достас функция əдеттегі функция немесе бұрынырақ анықталған басқа кластың əдісі болуы мүмкін. Оған қол жеткізу спецификаторлары əсер етпейді, оның кластағы жариялану орны да маңызды болып саналмайды.


  • Бір функция бірден бірнеше кластарға достас болуы мүмкін.


Мысал ретінде төменде monstr класына достас екі функцияның сипаттамалары берілген. kill функциясы hero класының əдісі болып табылады, ал steal_ammo функциясы ешбір класқа жатпайды. Екі функцияға да параметр ретінде monstr класының объектісіне сілтеме беріледі.

class monstr; // Кластың алдын ала анықталуы

class hero{

public:

void kill(monstr &);

...

};


class monstr{

...


friend int steal_ammo(monstr &);

friend void hero::kill(monstr &);

// hero класы ертерек анықталуы керек

};


int steal_ammo(monstr &M) {return --M.ammo;}

void hero::kill(monstr &M) {

M.health = 0; M.ammo = 0;}

Достас функцияларды мүмкіндігінше аз қолдануға тырысу керек, өйткені олар инкапсуляция қағидасына қайшы келеді (бұзады), осылайша программаны түзетіп жөндеуді жəне өзгертуді қиындатады.


Достас класс

Егер кез келген бір кластың барлық əдістері басқа кластың жасырын өрістерін пайдалануы қажет болса, онда ол класс түгелдей friend түйінді сөзінің көмегімен достас класс ретінде жарияланады. Төменде келтірілген мысалда mistress класы hero класына достас болып жарияланған:

class hero{

...

friend class mistress;

}


class mistress{

...


void f1();

void f2();

}

Мысалдағы fl жəне f2 функциялары hero класына достас болып табылады (friend түйінді сөзі жазылмағанына қарамастан) жəне оның барлық өрістеріне қол жеткізе алады.



Мұндағы friend түрінде жариялану қол жеткізу спецификаторы болып табылмайды жəне мұраланбайды.

ЕСКЕРТУ: Қандай функциялар мен кластардың достас немесе достас емес екенін класс өзі анықтайтынына назар аударыңыз.


Деструкторлар

Деструктор – бұл объектіге жұмсалып тұрған жады аймағын босату үшін қолданылатын əдістің ерекше түрі. Объект көріну аймағынан шыққан кезде деструктор автоматты түрде шақырылады:


  • жергілікті объектілер үшін – олар жарияланған блоктан шығу кезінде;


  • ауқымды объектілер үшін – main функциясынан шығу процедурасының бір бөлігі ретінде;


  • нұсқауыштар арқылы берілген объектілер үшін деструктор delete операциясын колдану кезінде тікелей емес түрде шақырылады.





НАЗАР АУДАРЫҢЫЗ: Объектіге нұсқауыштың əрекет ету аймағынан шығу кезінде деструкторды автоматты түрде шақыру жүзеге асырылмайды.
Деструктордың атауы тильда белгісінен (~) басталады, одан кейін класс аты жазылады.
Деструктордың қасиеттері:
  • аргументтері жəне қайтарылатын мəні болмайды;




  • const немесе static ретінде жариялануы мүмкін емес;
  • мұраланбайды;


  • виртуалды болуы мүмкін.


Егер деструктор айқын түрде анықталмаған болса, компилятор автоматты түрде бос деструктор кұрады.

Объект құрамында динамикалық түрде бөлінетін жадыға нұсқауыштар бар болса, класта деструкторды тікелей айқын түрде сипаттау қажет, əйтпесе объектіні жою кезінде оның өріс-нұсқауыштары сілтеме жасаған жады бос аймақ ретінде белгіленбейді. Деструкторға нұсқауыш анықтау мүмкін емес.

Бұрыннан қарастырылып келе жатқан мысал үшін деструктор төмендегідей түрде болуы тиіс:

monstr::~monstr() {delete [] name;}

Деструктордың толық нақтыланған атын көрсету арқылы оны тікелей түрде шақыруға болады, мысалы:

monstr *m; ...

m -> ~monstr();



Бұл асыра жүктелген new операциясының көмегімен нақты көрсетілген жады адресі бөлінген объектілер үшін керек болуы мүмкін. Объект деструкторын ол қажет болмаған жағдайларда айқын түрде тікелей шақыру керек емес.
http://netref.ru

Достарыңызбен бөлісу:




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет