Бақылау сұрақтары.
1.Қандай жағдайда құрама оператор блокқа айналады?
2.Жады глобальды және локальды айнымалыларға сәйкес қалай таратылады?
3.Глобальды және локальды айнымалылардағы инициализция айырмашылығы неде байқалады?
4.main функциясының локальды айнымалылары өмірде қандай уақытқа ие?
5.Қайта жүктелген функциялардың ішінде анағұрлым келісетінін таңдау қай түрде орындалады?
3–Дәріс. Абстрактті тип ретіндегі класс
Класс анықтамасы
Жай класс әдісі
Кластың статикалық компоненттік функциялары
Берілгендер абстракциясында негізделетін (базируется) бағдарламаларды жүзеге асыру, өндіру және жобалау принциптерінің үйлесімділігі есептелетін есеп ерекшеліктері мен түсніктерін анағұрлым толық көрсететін деректердің жаңа типтерін құруды қарастырады. С++ тілінде бағдарламалаушы берілгендердің бос типтерін енгізу мен кластар арқылы орындалатын операцияларды анықтау мүмкіндіктеріне ие. Класс - бұл бар типтер негізіндегі туынды құрылымы бар (структурированный) тип.Класты ең оңай әдіспен келесі конструкция арқылы анықтауға болады:
Класс_кілті класс_аты { компоненттер тізімі };
мұнда класс_кілті - class, struct, union қызметші сөздерінің бірі;
класс_аты-еркімен таңдалатын идентификатор;
компоненттер тізімі-класқа қатысты функциялар мен типтелген берілгендердің сипаттаушылары мен анықтамалары. Компоненттер обьект күйін анықтайды және класс обьектісінің тәртібін шартқа негіздейді (обуславливают). Класс компонентттері деректер, функциялар, кластар, санап шығулар, биттік өрістер, достасқан функциялар, достасқан функциялар мен типтер атаулары бола алады. Мысалы:
class Classid
{ int k; // к, х, у жабық мүшелер-үнсіздік бойынша берілгендер
double x,y;
public: char lit, ch; // lit,ch ашық мүшелер - деректер
int f3(int,int); // кластың ашық әдістері
int Get x (void) // кластың орнына қою әдісі
{ return x; }
private:
void f1 (void); //жабық мүшелер-класс әдістері
int f2 (int);
};
Қатынау спецификаторлары public: және private: қатынау спецификаторлары класс мүшелеріне өтуге мүмкін беретін режимді анықтайды: private - класс мүшелерін жабыққа айналдырады, ал public - ашық. Кластың жабық мүшелеріне тек берілген класс мүшелерінің қатынауға рұқсаты бар, сонымен қатар функциялардың – класс достары. Кластың ашық мүшелеріне кез келген функциялардың қатынауға мүмкіншіліктері бар. Олар бар болып табылатын бағдарлама мен класс объектілерінің байланысы үшін арналған.
Класты жобалап отырып, оның қай мүшесін ашық, ал қайсысын жабық етуді мұқият ойластырған жөн. Көптеген жағдайда класс анықтамасы блокта локализацияланбаған, және класс атауының іс-әрекет облысы бүкіл файл болып табылады.
Жай кластық әдістерін анықтау класс анықтамасының ішінде болуы мүмкін және мұндай жағдайда олар автоматты түрде орын ауыстырғандар болып табылады. Орын ауыстыратын функцияларды егер функция қарапайым және қысқа болса, қолданған жөн, мысалы, Get x ( ) функциясы.
Әдетте, қауіпсіздікті жоғарылату мақсатымен кластың мүше-берілгендерін жалпыға бірдей рұқсат етілмейтін етеді және еркін бағдарлама ортасынан олармен тікелей байланысуға болмайды. Бірақ бұған қарамастан олармен кластың барлығына рұқсат етілген әдістерін қолданып ерікті бағдарламалық ортадан да жұмыс істеуге болады (public:). Жоғарыда қарастырылған мысал үшін келесі әдіс қолданылады:
int Get x (void)
{ return x; }
жабық мүше мәнін берілген х қайтарады.
Арнайы түрде мұндай әдістердің «жүдеу» денелерін тиімділікті жоғарылату үшін орын ауыстырушы етіп класс анықтамасының ішінде енгізеді. Класс анықтамасынан тыс орналастыратын әдістерді анықтаған жағдайда әдістер тақырыбына inline спецификаторы қосылады.
«Клиент – сервер» технологиясы бойынша класс әдістерін анықтау класс анықтамасынан тыс орналастырған жөн. Көру облысының «::» рұқсат ету операторы арқылы компиляторға берілген анықталатын әдіс қандай класқа қатысты екендігін хабарлайды, мысалы:
int Classid:: f2 (int х)
{ әдіс денесі }
Класс анықтамасы берілген класс объектілерін құрмайды. Объектілер оларды анықтау жолымен ғана құрады, мысалы:
Classid obj1, obj2, obj Array [10];
Класс объектісінің өлшемі кластың статикалық емес мүше берілгендерінің өлшемдер қосындысымен жадыда анықталады. Класс әдістері класс объектісі үшін бөлінген жады облысының орнын алмайды.
Бірнеше файлдардан тұратын бағдарламалық жобалармен жұмыс жасағанда класс анықтамасы берілген класс объектілері қолданатын немесе оның әдістері анықталатан файлдарда болуға міндетті. Сондықтан класс анықтамасын арнайы түрде ол қажет болып табылатын файлдарда #include дерективасы көмегімен қосылатын тақырыптық файлға (хедер-файл) орналастырылады. Егер класс әдісінің анықтамасы анықталудан тыс орналасса, онда ол міндетті түрде өзі қолданылатын файлдарда анықталған болуы керек. Мұндай әдістің анықтамасы класс анықтамасымен бірге тақырыптық файлда болуы керек.
Белгілі бір класс объектісінің ашық мүшелеріне қатынауға рұқсат алуды тура «.» және жанама « » таңдау операторлары көмегімен жүзеге асырылады.
C++ тілінде обьектілерді жою мен инициализациялау жұмыстарын орындайтын, обьектілердің жойылуы мен құрылуы кезінде автоматты түрде шақырылатын, кластың арнайы әдістері сәйкесінше конструкторлар мен деструкторлар деп аталады. Класта бірнеше конструкторларды құруға болады. Әрбір конструктордың өзінің басқалардан айырмашылығы бар параметрлері болады . Параметрлері жоқ конструктор үнсіздік конструкторы. Деструктор әрқашан жалғыз және параметрлері болмайды.
Тек ашық мүшелері бар және конструкторы жоқ класс обьектісі мәндер тізімі арқылы жай құрылымдық айнымалы сияқты инициализациялануы мүмкін.
Егер класс конструкторларының біреуі де ашық функция – класс мүшесі болып табылмаса, онда мұндай кластың мүшелері құрыла алмайды. Мұндай кластар басқа кластар (мұрагерлік) үшін базалық кластар (родительдік) болып табылады.
Класс обьектісін құрған кезде ол үшін сәйкес келетін конструктор автоматты түрде шақырылады. Обьекттің мүше-берілгендерінің (обьект айнымалыларының) инициализациясы конструктордың орындалуы сияқты инициализациясы кезінде де орындала алады.
Конструктор параметрі өз класы бола алмайды, бірақ көшіру конструкторы сияқты оған жасалған сілтеме болуы мүмкін.
Кластың компонент-берілгенінің жалғыз данасы болуы үшін және кластың жаңа әрбір кластың обьектісінің құрылуы кезінде басып шығарылмауы (не тиражировался) үшін ол класты статикалық сияқты анықтау керек, яғни Static атрибуты болуы керек.
Кластың статикалық компоненттік функциялары нақты обьект атауы жоқ кластың Static берілгендеріне қатынасуды қамтамасыз етеді. Кластың Static функциялары функциялардың жай (статикалық емес) компоненттік барлық негізгі ерекшеліктерін сақтайды.
Класқа қатысты функция нақты обьекттің берілгендерін өңдеу үшін шақырған кезде бұл функцияға автоматты және айқын емес функция шақырылған обьект көрсеткіші беріледі. Бұл көрсеткіштің бекітілген this аты бар және бағдарламалаушы үшін байқаусыз кластың әрбір функциясы келесі түрде анықталған:
класс_аты*const this=өңделетін_обьекттің_адресі;
this көрсеткішін қолдану тиімділігі көрінетін жағдайлар:
-берілген класс компонентінің аты класс функциясының формальды параметрінің атымен сәйкес келгенде;
-класс функциясының денесінде айқын түрде бұл функция шақырылған обьект адресін көрсету қажет болғанда;
-функция параметрі ретінде кластың бұл функция атын жазған кезде обьекттің нақты атына жол берілмегенде (керек обьектіге мұндай функция сілтемесін немесе көрсеткішін берудің орнына).
Достарыңызбен бөлісу: |