Borland c++ builder
Кіріспе
1 Мәселенің қойылымы
1.1 Объектілі түрдің мәліметтері
1.2 Класстар
1.3 Виртуалдық функциялар
1.4 "Достар" ( friend ) функциялары
1.5 Массивтер туралы түсінік
2 Бағдарламалық қамтамасыздандыруды жобалау және өңдеу
2.1 Зерттеу объектісінің талдауы
2.2 Алгоритмнің өңделу шешімі
2.3 Бағдарламаның инструкциясы
Қорытынды
Қолданылған әдебиеттер:
1 Мәселенің қойылымы
1.1 Объектілі түрдің мәліметтері
1.2 Класстар
1.3 Виртуалдық функциялар
1.4 "Достар" ( friend ) функциялары
1.5 Массивтер туралы түсінік
2 Бағдарламалық қамтамасыздандыруды жобалау және өңдеу
2.1 Зерттеу объектісінің талдауы
2.2 Алгоритмнің өңделу шешімі
2.3 Бағдарламаның инструкциясы
Қорытынды
Қолданылған әдебиеттер:
Өткен ғасырдың орта кездерінде есептеуіш техника саласында күрделі өзгерістер болып, Фортран, Бейсик, Паскаль және т.б. көптеген жоғары деңгейлі программалау тілдерінің жарыққа шыққаны белгілі. Кітапта оқырмандар ол тілдердің кейбірімен бастапқы түрде болса да таныс деп есептелген.
1972 жылы AT&T атаулы Американың корпорациясы жаңа С (Си) программалау тілін дайындап шықты. Ол – құрылымдық және алгоритмдерді басшылыққа алып дайындалған процедуралық жоғары деңгейлі тіл.
Тілге жылдам орындалатын, жеке биттермен операция жасайтын операторлар да енгізілген. Олар арқылы байланыс порттарын, магниттік дискілерде жинақтауыштарды және т.б. аппараттық құралдарды басқаруға мүмкіндік жасалды. Ал, алғашқы кездерде жеке типті компьютерлердің аппараттық құралдарына қол жеткізе алатын мшиналық командалармен жұмыс істейтін төменгі деңгейлі асссемблер тілі ғана болатын.
Си тілі бірте – бірте дамытылып, қазіргі кезде пайдаланылып келе жатқан, 1983 жылы дүние жүзі елдері басшылыққа алған ANSI C нұсқасы да жарыққа шықты. Тілдің кемшілігі де жоқ емес, ол жүйелік және қолданбалы программаларды дайындауға бейім, бірақ айнымалыларға рұқсат етілмеген қол жеткізу механизмін қамтамасыз етпейді және құрылатын класты басқа кластың ішкі класы (мұрагер) ретінде жариялау мүмкін емес.
Borland C++ Builder алтыншы нұсқасы 2002 жылы шыққан, Windows үшін бүгінгі күнде С++ жетілген визуалдық ортада тез өңделіп, жылдам жұмыс істейді. Оның құрамына 200 әртүрлі компоненттер кіреді, ал аяқталған бағдарлама жасауы үшін минимум күш талап етеді. Borland C++ Builder жақын арадағы бәсекешісі – ол жүйе емес Microsoft Visual C++, ол басқа схемада жасалған және ол RAD – жүйесі, ал MS Visual Basic - өңдеу түрдің ортасы. Бірақ бағдарламаның нәтижелелігі, C++ Builder жасаушыларының арқасында MS Visual Basic қарағанда он есе бағдарлама әрекеті басым болады. Бүгінгі күнде C++ Builder ортасында сандық еркін компоненттерде оған сай келмейді. Осы C++ Builder жүйесінде қабылданған туған інісі бар, ол RAD – ортасы Borland Delphi, жұмыстың технологиясы толық түрде технологиясымен ұқсас келеді. Delphi бағдарламалық код түрінде С++ тілінде жазылмайды, ол Паскаль бағдарламалық тілінде жазылады, нақты айтқанда ол объектілік – ориентированный нұсқасы Object Pascal жазылады. Бірақ ең қызығы Borland C++ Builder бір уақытта С++ және Паскаль тілінде де бағдарламаны құруға рұқсат береді.
1972 жылы AT&T атаулы Американың корпорациясы жаңа С (Си) программалау тілін дайындап шықты. Ол – құрылымдық және алгоритмдерді басшылыққа алып дайындалған процедуралық жоғары деңгейлі тіл.
Тілге жылдам орындалатын, жеке биттермен операция жасайтын операторлар да енгізілген. Олар арқылы байланыс порттарын, магниттік дискілерде жинақтауыштарды және т.б. аппараттық құралдарды басқаруға мүмкіндік жасалды. Ал, алғашқы кездерде жеке типті компьютерлердің аппараттық құралдарына қол жеткізе алатын мшиналық командалармен жұмыс істейтін төменгі деңгейлі асссемблер тілі ғана болатын.
Си тілі бірте – бірте дамытылып, қазіргі кезде пайдаланылып келе жатқан, 1983 жылы дүние жүзі елдері басшылыққа алған ANSI C нұсқасы да жарыққа шықты. Тілдің кемшілігі де жоқ емес, ол жүйелік және қолданбалы программаларды дайындауға бейім, бірақ айнымалыларға рұқсат етілмеген қол жеткізу механизмін қамтамасыз етпейді және құрылатын класты басқа кластың ішкі класы (мұрагер) ретінде жариялау мүмкін емес.
Borland C++ Builder алтыншы нұсқасы 2002 жылы шыққан, Windows үшін бүгінгі күнде С++ жетілген визуалдық ортада тез өңделіп, жылдам жұмыс істейді. Оның құрамына 200 әртүрлі компоненттер кіреді, ал аяқталған бағдарлама жасауы үшін минимум күш талап етеді. Borland C++ Builder жақын арадағы бәсекешісі – ол жүйе емес Microsoft Visual C++, ол басқа схемада жасалған және ол RAD – жүйесі, ал MS Visual Basic - өңдеу түрдің ортасы. Бірақ бағдарламаның нәтижелелігі, C++ Builder жасаушыларының арқасында MS Visual Basic қарағанда он есе бағдарлама әрекеті басым болады. Бүгінгі күнде C++ Builder ортасында сандық еркін компоненттерде оған сай келмейді. Осы C++ Builder жүйесінде қабылданған туған інісі бар, ол RAD – ортасы Borland Delphi, жұмыстың технологиясы толық түрде технологиясымен ұқсас келеді. Delphi бағдарламалық код түрінде С++ тілінде жазылмайды, ол Паскаль бағдарламалық тілінде жазылады, нақты айтқанда ол объектілік – ориентированный нұсқасы Object Pascal жазылады. Бірақ ең қызығы Borland C++ Builder бір уақытта С++ және Паскаль тілінде де бағдарламаны құруға рұқсат береді.
1. «Специальный справочник С++» Борис Карпов, Татьяна Баранова (издательство Питер).
2. «Самоучитель программирования на Borland С++ Bilder 5.0» С. Бобровский ( издательство Десс Ком).
3. Сворт Б. «С++ Bilder».
4. В.В. Фаронов «С++ Bilder». Санк – Петербург 2005г.
5. Культин Н.б. «С++ Bilder в задачах и примерах». Санк – Петербург 2005г.
6. Камардинов О. «Turbo C және Turbo C++ тілдерінде программалау»
7. Боревич Э.И. «Определители и матрицы».
2. «Самоучитель программирования на Borland С++ Bilder 5.0» С. Бобровский ( издательство Десс Ком).
3. Сворт Б. «С++ Bilder».
4. В.В. Фаронов «С++ Bilder». Санк – Петербург 2005г.
5. Культин Н.б. «С++ Bilder в задачах и примерах». Санк – Петербург 2005г.
6. Камардинов О. «Turbo C және Turbo C++ тілдерінде программалау»
7. Боревич Э.И. «Определители и матрицы».
Пән: Информатика, Программалау, Мәліметтер қоры
Жұмыс түрі: Курстық жұмыс
Тегін: Антиплагиат
Көлемі: 29 бет
Таңдаулыға:
Жұмыс түрі: Курстық жұмыс
Тегін: Антиплагиат
Көлемі: 29 бет
Таңдаулыға:
Кіріспе
Өткен ғасырдың орта кездерінде есептеуіш техника саласында күрделі
өзгерістер болып, Фортран, Бейсик, Паскаль және т.б. көптеген жоғары
деңгейлі программалау тілдерінің жарыққа шыққаны белгілі. Кітапта
оқырмандар ол тілдердің кейбірімен бастапқы түрде болса да таныс деп
есептелген.
1972 жылы AT&T атаулы Американың корпорациясы жаңа С (Си) программалау
тілін дайындап шықты. Ол – құрылымдық және алгоритмдерді басшылыққа алып
дайындалған процедуралық жоғары деңгейлі тіл.
Тілге жылдам орындалатын, жеке биттермен операция жасайтын операторлар
да енгізілген. Олар арқылы байланыс порттарын, магниттік дискілерде
жинақтауыштарды және т.б. аппараттық құралдарды басқаруға мүмкіндік
жасалды. Ал, алғашқы кездерде жеке типті компьютерлердің аппараттық
құралдарына қол жеткізе алатын мшиналық командалармен жұмыс істейтін
төменгі деңгейлі асссемблер тілі ғана болатын.
Си тілі бірте – бірте дамытылып, қазіргі кезде пайдаланылып келе
жатқан, 1983 жылы дүние жүзі елдері басшылыққа алған ANSI C нұсқасы да
жарыққа шықты. Тілдің кемшілігі де жоқ емес, ол жүйелік және қолданбалы
программаларды дайындауға бейім, бірақ айнымалыларға рұқсат етілмеген қол
жеткізу механизмін қамтамасыз етпейді және құрылатын класты басқа кластың
ішкі класы (мұрагер) ретінде жариялау мүмкін емес.
Borland C++ Builder алтыншы нұсқасы 2002 жылы шыққан, Windows үшін
бүгінгі күнде С++ жетілген визуалдық ортада тез өңделіп, жылдам жұмыс
істейді. Оның құрамына 200 әртүрлі компоненттер кіреді, ал аяқталған
бағдарлама жасауы үшін минимум күш талап етеді. Borland C++ Builder жақын
арадағы бәсекешісі – ол жүйе емес Microsoft Visual C++, ол басқа схемада
жасалған және ол RAD – жүйесі, ал MS Visual Basic - өңдеу түрдің ортасы.
Бірақ бағдарламаның нәтижелелігі, C++ Builder жасаушыларының арқасында MS
Visual Basic қарағанда он есе бағдарлама әрекеті басым болады. Бүгінгі
күнде C++ Builder ортасында сандық еркін компоненттерде оған сай келмейді.
Осы C++ Builder жүйесінде қабылданған туған інісі бар, ол RAD – ортасы
Borland Delphi, жұмыстың технологиясы толық түрде технологиясымен ұқсас
келеді. Delphi бағдарламалық код түрінде С++ тілінде жазылмайды, ол Паскаль
бағдарламалық тілінде жазылады, нақты айтқанда ол объектілік –
ориентированный нұсқасы Object Pascal жазылады. Бірақ ең қызығы Borland C++
Builder бір уақытта С++ және Паскаль тілінде де бағдарламаны құруға рұқсат
береді.
1 Мәселенің қойылымы
1.1 Объектілі түрдің мәліметтері
Объектілі түрдің мәліметтері – бұл агрегеаттық түрлер, компоненттік
мәліметтер объектілі түрдің баяндалуын міндетті түрде қолдануы керек,
анықтау облысында бұл айнымалы түрдің мағынасын мүмкіндігінше анықтау,
компоненттік мәліметтер және осы айнымалы түрдің анықтау
операциясының айнымалысын біріктіру, мұны толығымен анықтайтын
программистер. Біріктірілуін сақтау үшін Си программасы синтаксистік
анықтау объектілік түрде Си ++ түрдің анықтау структурасын таңдап
толығымен берілген және өзінше Си – да біріктірілген. Си ++
структурасы және біріктірілуі объекттілік түр нұсқа түрінде
көрсетілген. Обекттілік түрде 3 – ке бөлу нұсқасы бар: структурасы
( struct ), біріктірілуі ( union ) және классы ( class ), түрдің
компоненттеріне енуін мүмкіндікше ажырату. Объекттілік түр мұнан
былай барлық нұсқаларын класс деп атаймыз. Обектілі түрдің
анықтамасы схема түрде құрылады:
нұсқа_түрі ат_түрі: базалық_класстардың_тізімі
{ компоненттер (мүшесі) классы }
Класстың компоненттері компонент мәліметтері және компонент
функциясы болуы мүмкін. Компонент функциясы объектілі мәліметтерін
операциясын орындау үшін берілген, оларды жиі класстар әдісі деп
атайды.
Әрбір класс компоненттері үшін кіру деңгейі орналасады немесе
бір кілттік сөз public, protected немесе private екілік кіру
деңгейі көрсетілген. Барлық келесі компоненттер классына көрсетілген
кіру деңгейі қарасты public деңгейі компоненттік классқа
бағдарламаның кез келген орнына орнатуға рұқсат берілген және бұл
класстың айнымалысы белгілі болса ғана жұмыс атқарады. Private кіру
деңгейі компоненттік класстарға тек қана бұл класстың әдісі
бойынша кіруге рұқсат береді. Protected кіру деңгейі тек қана
мағынасы бойынша иерархиялық класстар жүйесі және туынды әдіс
класстарына осы деңгейдің компоненттеріне кіруге рұқсат береді.
Struct барлық компоненттер класының түрі үндемей public кіру
деңгейіне алынады, бірақ басқа да кіру деңгейлеріне тапсырма беруге
болады, class класс компоненттері түріне үндемей кіру деңгейі
private, union класс түріне кіру деңгейі public және ол
өзгертілмеген және де басқа да кіру деңгейлерін анықтауға болады.
Мысалы, программист TPoint ( нүкте ) классын шешті дейміз,
сыртқы нүктенің координаттарына кіруге рұқсат бермеген және сыртқы
жазықтықтағы нүктелерін жылжыту әдісіне рұқсат етілген. TPoint
классын мынадай қылып анықтауға болады:
class TPoint
{ private :
int x , y ;
public :
void movePoint ( int newx , int newy ); жаңа нүктеге
void relmove ( int dx , int dy ); dx қызметтен алу , dy
int getx ( void )( return x ;};
int gety ( void ){ return y ;};
};
Функцияның компоненттерін анықтау классында өшірілуі мүмкін,
функция getx және gety мысалысында көрсетілген немесе анықтау
классында көрсетілмеген. Функция компоненттін шықыру барысында
қосымша аргумент алу – шақырылған функция және көрсетілген функция
беттеріне барлық компоненттер классы көрсетілген анықталмаған
объектілік түрде жүреді. Компоненттер функциясының көрсетілімін
анықтау классынан тыс рұқсат берілген контексттік операциясын
қолдану, бұл функцияның классқа тиісті екенін компиляторға
хабарлайды. TPoint классының әдісін былай жазуға болады:
void TPoint : : movePoint ( int newx, int newy )
{ x = newx; y = newy ; }
void TPoint : : relmove ( int dx, int dy )
{ x += dx; y += dy ; }
Компонент – осы бастапқы инициялизацияны орындау үшін
өзгерткіштердің түрі баяндау объектті түрді арнайы әдістер –
конструкторларды қосады. Конструктор аты түрдің атымен сәйкес
келеді. Қайталанатын мағына түрінің ешқашан мағыналары көрсетілмейді
және конструктор ол үшін қайтарып бермейді. Жоғары TPoint классын
көру үшін конструкторсыз жұмыс істеуге болады және movePoint
инициялизация әдісін қолдану. TRect классын мысал ретінде көріп
шығамыз, тік бұрыш жақтарымен бейнелеуші, параллельді
координаттарының өстері:
enum Boolean {FALSE, TRUE };
class TRect
{ public:
TPoint a,b; a - сол жоғарғы бұрыш , b - оң төменгі бұрыш
void move( int dx, int dy) тікбұрыштың ауыспалылығы
{ a.relmove ( dx, dy ); b.relmove ( dx, dy );}
void grow( int dx, int dy) размерлердің өзгертілуі
{ a.x +=dx; a.y += dy; b.x +=dx; b.y += dy; }
void intersect (const TRect& r); екі тікбұрыш жалпы бөлімі
void Union ( const TRect& r); * Тікбұрыш , қамтылған екі
тікбұрыш *
Boolean contains ( const TPoint& p);
* TRUE, егер p нүктесі тікбұрышта жатса *
Boolean isEmpty( );
* TRUE, егер ені немесе тікбұрыш биігі нольге тең
болса *
TRect (int ax, int ay, int bx, int by ) конструктор
{ a,x - ax; a,y = ay; b.x = bx; b.y = by; };
TRect ( TPoint p1, TPoint p2) конструктор
{ a = p1; b = p2; };
TRect () конструктор
{ a.x = a.y = b.x = b.y = 0; };
};
* Класстың әдісі TRect *
void TRect : : intersect (const TRect& r)
{ a.x = max (a.x, r.a.x ); b.x = min ( b.x, r.b.x );
a.y = max (a.y, r.a.y ); b.y = min ( b.y, r.b.y );
};
void TRect : : Union ( const TRect & r )
{ a.x = ( a.x = r.a.x ) ? a.x : r.a.x ;
a.y = ( a.y = r.a.y ) ? a.y : r.a.y ;
b.x = ( b.x = r.b.x ) ? b.x : r.b.x ;
b.y = ( b.y = r.b.y ) ? b.y : r.b.y ;
};
Boolean TRect : : contains ( const TPoint & p )
{ return Boolean (p.x = p.x && p.x b.x && p.y = a.y && p.y
b.y); };
Boolean TRect : : isEmpty ( )
{ return Boolean ( a.x = b.x a.y = b.y ); };
Толық түрдегі хабарлар объектілі түрдің конструкторлары туралы
көбірек келесі бөлімдерде көрсетілген.
Өзгергіш объектілі түрдің жариялануы жалпы ережелермен
құрылады, бірақ конструктор классында өзгергіш идентификаторын
жақшалардың ішінде аргументтерін анықтауға және көрсетуге болады:
TRect r1(2,4,20,50); инициализация бірінші конструктордың
қолдануымен
TRect *pr = &r1; TRect көрсеткіші
TRect r2, *ptr; r2 үшін конструктор параметрсіз
қолданылады
Орналастыруға арналған new операциясында объектті өзгерткіш
динамикалық жады түр атының және мына түр конструктор аргументтерін
қатар көрсетеді:
ptr = new TRect( 7,3,18,40);
Объектті түрдің компоненттеріне айналдыруға арналған аты оған
компоненттер объектті өзгергіш атпен немесе көсеткішпен анықтау:
r1.grow( 2, -3);
pr-move( 1, 1);
Boolean bb= r1.isEmpty( );
Конструкторлар және деструкторлар
Класстың түсіндірмесі арнайы әдістерін әдеттегідей қолданады,
шақырушылар өзгергіш мына классты құру және динамикалық жадыдан -
конструкторларды және деструкторлардың өзгерткіштерін жою. Конструктор
жад өзгергіш және компонент мәліметтерінің инициялизациясын
қамтамасыздандырады, бөлінімінен кейін шақырылады, ол үшін деструктор
жад босатылуынан алдын ала шақырылады, орын иеленген объектілі
өзгергіштің және қосымша әрекеттердің орындалу үшін арналған
байланысқан объектілі өзгерткіштерін жою, мысалы, жад босауына
арналған, бөлінген объектіге арналған учаскенің сырсында,
компоненттің мәліметтерін апару.
Белгілерген конструктордың әрқашан аты болады, классатымен
сәйкес келуші, ешқандай мағыналар қайтарылып берілмейді қайтарылатын
мағына түр және ол үшін көрсетілмейді. Барлық компонент
мәліметтерін конструктор инициализациясын қамтамасыздандыру керек.
Классқа арналған конструктордың бірнеше мүмкіндігі белгілі, санмен
айыратындардың және параметрлердің түрлерін қолданады. Жалпы жағдайда
конструкторлардың келесі түрлерін айырып таниды: конструктор
парамтрлерімен, конструктор параметрлерісіз және көшіріп алу
конструкторлары бір параметрлі – осы объектілі түрдің сілтеме мен
өзгерткішті таниды. Егер объектілі түр бір де бір конструкторы
анықталмаса, компилятор конструкторды үндемей құрып береді және ол
параметрсіз қолданылады. Көшіріп алу конструкторы қажетті, егер
өзгергіш объектілі түрдің қандай да болмасын функция аргумент
түрінде берілсе, сондықтан барлық аргументтер функцияға мәні жағынан
беріледі.
Деструктор қажетті, егер объектілі түр компоненттерге
берілгендер берілсе, динамикалық берілгендер көрсеткіш болатын болса,
өзгергіш объектіні жою барысында жоюылуы керек. Деструктор
әрқашанда сол аты болады, класстың атына байланысты сол атпен,
бірақ аттың берілу атында (тильда) ~ белгісі жазылады. Деструктордың
параметрі болмайды және ұқсас конструкторға ешқандай мағына
қайтарылып берілмейді.
TString объектілі түрін мысал ретінде қарастырамыз, ол үшін
қателерден жоғары дәрежеде қорғалған, реттелген мәліметтер
көрсетіледі, string.h. файл – тақырыбшалары қатарларын өңдеп
стардарттық функциялармен қамтамасыздандырады.
include iostream.h
include string.h
class TString
{ public:
TString(); конструктор параметрлерсіз
TString(int n, char* s=0); конструктор , бос жолды
жасаушы * конструктор , TString түрінде нольмен аяқтайтын char
массивті қайта құрушы *
TString(char* s);
TString(TString& st); көшіріп алу конструкторы
~TString(); деструктор
void print(); экранға жол шығаруы
int sz; жол ұзындығы
char* ps; жол сақтауына арналған
жадқа көрсеткіш
};
* TString сынып әдістері *
TString::TString( ){sz=0; ps=0;}
TString::TString(int n, char* s)
{ sz=n; ps=new char[n+1];
strncpy(ps,s,n); ps[sz]='\0';
}
TString::TString(char* s)
{ sz=strlen(s)+1; ps=new char[sz];
strcpy(ps,s);
}
TString::TString(TString& str)
{ sz = str.sz; ps=new char[sz+1];
strcpy(ps,str.ps);
}
TString::~TString( )
{ if (ps != 0) delete [] ps; }
void TString::print( )
{ if (sz == 0 )
{ cout " Бос жол " endl; return;}
cout" Жол = " ps endl;
}
Бағдарламалар төмен түрде келтірілген , TString түрінің көрнектейтін
берілгендерді қолдану.
int main()
{ char rabstr [60] = "yes";
while (*rabstr !='n')
{ cin rabstr;
if (*rabstr == 'n')break;
TString s1();
TString s2(6);
TString s3(6, rabstr);
TString* ps1=new TString("мынау жол көрсеткішпен ");
cout " s1="; ps1-print();
cout " s2="; s2.print();
cout " s3="; s3.print();
}
return 0;
}
Конструктор түрлендіруін оңайлатуға болады, егер компоненттік
мәліметтер базалық түрге қарасты немесе өзгергіш объектілі
конструкторының бар болуы. Функция тақырыбшасынан кейін
конструктордың түрленінен кейін қос нүкте болады және содан кейін
инициялизацияның тізімін идентификатор (аргумент) түрінде болады.
Мысалы, TPoint классында конструкторды дәл анықтауға болады:
class TPoint
( ... .
public:
TPoint ( int x0, int y0 ) : x (x0), y (y0){ };
}
Осы конструкторда барлық компоненттер инициализация тізімінен
мағыналарды алуға, ал конструктор денесі құрамында бос оператор
көрсетілген.
1.2 Класстар
Класстар иерархиялық құрылымда құрастырылады, кейбір базалық
класстар бөлінеді, ұқсас класстар топ әдістерін және туынды
класстарын барлық мәліметтерде сақтайды, осы мәліметтерге және
әдістерге базалық кластан мәліметтер мен әдістер қосылады, осылардың
барлығы туынды классты орындауға арналған. Класстардың жүйесінің
түрленуі былай:
class TA базалық класс
{ Өзгергіштер және әдістері TA }
class TAA : public TA Класс , TA туынды касстан
{ Өзгергіштер және әдістері TAA }
class TAAB : public TAA Класс, TAAB туынды касстан
{ Өзгергіштер және әдістері TAAB }
Базалық класстың компоненттерін кілттік сөзін public және
private басқаруға рұқсат береді. Егер базалық класс public болса,
онда класста public - компоненттері базалық класста public болып
қалады, protected – компоненттері базалық класста protected болып
қалады, private – компоненттері базалық класста туынды класстың
функцияларына рұқсат бермейді.
Егер базалық класс private болса, туынды класстың public және
базалық protected – компоненттері туынды класстың функцияларын
ұсынады, келесі туынды класстар үшін олар private деп саналатын
болады, бірақ бұларға рұқсат етілмейді, базалық класстың private –
компоненттері туынды классқа қолы жетпейді.
Туынды класс конструкторы базалық класстың өзіндік конструкторын
шақыру керек:
class TBase
{ public: TBase( int s, int m, int d);
* TBase сынып басқа компоненттері *
}
class TVect : public TBase
{ public: TVect ( int k, int s, int m int d): TBase(s, m, d)
{ * Қалған TVect компонентінің инициализациясы
*};
1.3 Виртуалдық функциялар
Функциялардың объектілі түрлерінің түрленуі үшін әртүрлі
класстардың ұқсас белгілері бар болуында, олар бірдей атпен болуы
мүмкін, олар параметрлердің түрлері және қайтарылған мағынада бола
алады. Мұндай функцияға шақыру нұсқау атымен объекттік компиляторға
белгілі, қандай аттас функциялар қолданылатынын біледі. Осы уақытта
туынды түрдің объекттілеріне базалық түр көрсеткішімен шақыруға
болады және компилятор этапында орнатуға болмайды, функция қандай
да бір туынды түрден шақырылуы керек. Бағдарлама кіру барысында
тексеру керек болады, қандайда түр объектісіне көрсеткіш сілтейді
және тексерулерден кейін керекті функцияны шақырады. Бұл әрекеттерді
"кейінгі" байланысулар деп атайды, "алдынғы" байланысулардан
айырмашылығы, компилятор этапында немесе байланыс редакциялардың
негізінде шақырылған функциялардың кіру адресс нүктесін орнатуға
болады. Объектілі – орентированных тілде мына келеңсіздіктерді
шешіміне арналған виртуалды әдістерді бағдарламалауда қолданылады.
Виртуалды функциялардың түсіндірмесі
Функция компоненттерінің классы virtual кілттік сөзін виртуалды
көрсеткішпен жарияланады. Функциялар компоненттері туынды класста,
базалық класстың ауыстырушы виртуалдық функциялары сол атпен
жариялануы тиім, сол параметрлердің тізімімен және түрдің
қайтарылған мағынасында, және ол базалық класстың функциясына тиісті
болуы керек. Егер туынды класстан жаңа туынды класстар мағлұмат
берілсе, кілттік virtual сөздің функциясының түрлендіруін жіберуге
болады.
Егер туынды класста функция жарияланулары сол атпен жоқ
болса, онда базалық класстың функцияларына шақырылатын болады.
Виртуалды функция мына форма түрде шақырылуы мүмкін:
virtual void print ( ) = 0;
Мұндай функция "таза" (pure) виртуалдық функция деп аталады,
ал объекттік түр және оны жариялауын ұстап тұратынды абстрактылы
объекттік түр деп атайды. Бағдарламада абстрактылы түрдің даналары
алмайды, мұндай түрлер тек қана туынды түрдің пайда болуында
қолданылады, туынды түр тағы да виртуалдық функцияның тазасын
анықтау керек болады немесе нақты әрекеттердің орындалу барысында
оны кәдімгі виртуалдық функция ретінде жарияланады.
Виртуалды функциялар әсіресе пайдалы әдіс классы көрсеткіш
арқылы класстың даналарында пайда болады, ал сол көрсеткіштің өзі
базалық классқа көрсеткіш түрі болады. Мысалы, TBase классында
print таза виртуалды функциясы жарияланған:
class TBase массивтердің барлық түрлеріне
арналған базалық класс
{int size, элемент размері
count, ағымдағы сандық элементтер
maxCount, байттарға бөлінген жад орны
delta; байттарға жадтың жетілдірілуі
char *pmem; бөлінген жадқа көрсеткіш
int changeSize(); жадтың қайта бөлінуі
protected:
void* getAddr( ){return (void*) pmem;};
void addNewItem(void*); массив соңында қосу
void error(const char* msg){cout msgendl;};
public:
int getCount() {return count;};
TBase(int s,int m,int d);
TBase();
TBase(TBase&);
~TBase();
virtual void print ( ) = 0; Таза виртуалды функция
};
Онда туынды класстарда print функциялары тиісті нақты әрекеттер
орындалуы мүмкін болады:
class TIntArray : public TBase
{ * Другие методы *
virtual void print ( );
}
class TRealArray : public TBase
{ * Другие методы *
virtual void print ( );
}
Бағдарламада, TIntArray класстың объектілері және TRealArray сол
класстың даналары құрылуға болады, көрсеткіш арқылы базалық
класстан пайда болу мүмкіншілігі:
TBase *pb;
TIntArray aint(5,3);
TRealArray areal(4,2);
Онда баспаға шығару үшін массив операторлары қолданыла алады:
pb = &aint; pb-print(); aint массив баспасы
pb = &areal; pb-print(); areal массив баспасы
Виртуалдық функцияға тағы да мысал келтірейік. Кейбір әуесқой
үй жануарларын және өзінің жақсы көретін жануарларын каталогқа
орналастыру үшін, барлық жануарлардың түрлеріне байланысты өзінің
Pet базалық класстарын анықтау үшін қолданылады. Қысқаша түрде
әрбір жануарға лақап және ірі жануарларды дауыс арқылы бөледі,
экранға лақаптарының және жануарлардың дауыстарының тізімін шығаруға
мүмкіндік береді.
Бағдарлама:
#include iostream.h
struct Pet Базалық класс
{ char *name;
virtual void speak() = 0;
Pet( char *nm){name=nm;}
}
struct Dog : public Pet
{ virtual void speak( ) { coutname“ сөйлейді “”“ Ав -
ав”endl; };
Dog(char *nm): Pet(nm) { };
};
struct Cat : public Pet
{ virtual void speak( ) { coutname“ сөйлейді “
“ Мяу-Мяу”endl;
Cat(char *nm): Pet(nm) { };
}
int main ()
{ Pet *mypets[ ] = { new Dog(“Шарик”),
new Cat(“Мурка”),
new Dog(“Рыжий “)}; Жануарлардың
тізімі
const int sz = sizeof( mypets) sizeof( mypets [ 0 ]);
for ( int k = 0: k sz; k++)
mypets [ k ]-speak();
return 0;
}
1.4 "Достар" ( friend ) функциялары
Функция, туынды класста жариялайды, тек қана қорғалған
(protected) рұқсат беріледі немесе жалпы ( public ) базалық класстың
компоненттеріне.
Функция, класстың сыртында тек қана жалпыға ( public )
компоненттер классына және ат бойынша сұрау, объектінің атпен
анықталған немесе объектінің көрсеткіші арқылы жарияланады.
Функцияда кейбір объектілік Х класстардың компоненттеріне жеке
рұқсат алу үшін, оларға қатысты рұқсат алмаған, бұл функция Х
класста достар деп шығарылуы керек:
class X
{ friend void Y:: fprv( int, char*);
*Басқа Х класстың компоненттері *
}
Барлық класстың Ү, Х класстың достық функцияларын шақыруға
болады:
class Y;
class X
{ friend Y;
* Басқа Х класстың компоненттері *
}
class Y
{ void fy1(int, int);
int fy2( char*, int);
* Басқа Ү класстың компоненттері *
}
Достар функцияда да болуы мүмкін, қандайда бір класстың
компонентті емес, мысалы:
class XX
{ friend int printXX ( );
* Басқа ХХ класстың компоненттері *
}
Осы print XX функциясы барлық ХХ ... жалғасы
Өткен ғасырдың орта кездерінде есептеуіш техника саласында күрделі
өзгерістер болып, Фортран, Бейсик, Паскаль және т.б. көптеген жоғары
деңгейлі программалау тілдерінің жарыққа шыққаны белгілі. Кітапта
оқырмандар ол тілдердің кейбірімен бастапқы түрде болса да таныс деп
есептелген.
1972 жылы AT&T атаулы Американың корпорациясы жаңа С (Си) программалау
тілін дайындап шықты. Ол – құрылымдық және алгоритмдерді басшылыққа алып
дайындалған процедуралық жоғары деңгейлі тіл.
Тілге жылдам орындалатын, жеке биттермен операция жасайтын операторлар
да енгізілген. Олар арқылы байланыс порттарын, магниттік дискілерде
жинақтауыштарды және т.б. аппараттық құралдарды басқаруға мүмкіндік
жасалды. Ал, алғашқы кездерде жеке типті компьютерлердің аппараттық
құралдарына қол жеткізе алатын мшиналық командалармен жұмыс істейтін
төменгі деңгейлі асссемблер тілі ғана болатын.
Си тілі бірте – бірте дамытылып, қазіргі кезде пайдаланылып келе
жатқан, 1983 жылы дүние жүзі елдері басшылыққа алған ANSI C нұсқасы да
жарыққа шықты. Тілдің кемшілігі де жоқ емес, ол жүйелік және қолданбалы
программаларды дайындауға бейім, бірақ айнымалыларға рұқсат етілмеген қол
жеткізу механизмін қамтамасыз етпейді және құрылатын класты басқа кластың
ішкі класы (мұрагер) ретінде жариялау мүмкін емес.
Borland C++ Builder алтыншы нұсқасы 2002 жылы шыққан, Windows үшін
бүгінгі күнде С++ жетілген визуалдық ортада тез өңделіп, жылдам жұмыс
істейді. Оның құрамына 200 әртүрлі компоненттер кіреді, ал аяқталған
бағдарлама жасауы үшін минимум күш талап етеді. Borland C++ Builder жақын
арадағы бәсекешісі – ол жүйе емес Microsoft Visual C++, ол басқа схемада
жасалған және ол RAD – жүйесі, ал MS Visual Basic - өңдеу түрдің ортасы.
Бірақ бағдарламаның нәтижелелігі, C++ Builder жасаушыларының арқасында MS
Visual Basic қарағанда он есе бағдарлама әрекеті басым болады. Бүгінгі
күнде C++ Builder ортасында сандық еркін компоненттерде оған сай келмейді.
Осы C++ Builder жүйесінде қабылданған туған інісі бар, ол RAD – ортасы
Borland Delphi, жұмыстың технологиясы толық түрде технологиясымен ұқсас
келеді. Delphi бағдарламалық код түрінде С++ тілінде жазылмайды, ол Паскаль
бағдарламалық тілінде жазылады, нақты айтқанда ол объектілік –
ориентированный нұсқасы Object Pascal жазылады. Бірақ ең қызығы Borland C++
Builder бір уақытта С++ және Паскаль тілінде де бағдарламаны құруға рұқсат
береді.
1 Мәселенің қойылымы
1.1 Объектілі түрдің мәліметтері
Объектілі түрдің мәліметтері – бұл агрегеаттық түрлер, компоненттік
мәліметтер объектілі түрдің баяндалуын міндетті түрде қолдануы керек,
анықтау облысында бұл айнымалы түрдің мағынасын мүмкіндігінше анықтау,
компоненттік мәліметтер және осы айнымалы түрдің анықтау
операциясының айнымалысын біріктіру, мұны толығымен анықтайтын
программистер. Біріктірілуін сақтау үшін Си программасы синтаксистік
анықтау объектілік түрде Си ++ түрдің анықтау структурасын таңдап
толығымен берілген және өзінше Си – да біріктірілген. Си ++
структурасы және біріктірілуі объекттілік түр нұсқа түрінде
көрсетілген. Обекттілік түрде 3 – ке бөлу нұсқасы бар: структурасы
( struct ), біріктірілуі ( union ) және классы ( class ), түрдің
компоненттеріне енуін мүмкіндікше ажырату. Объекттілік түр мұнан
былай барлық нұсқаларын класс деп атаймыз. Обектілі түрдің
анықтамасы схема түрде құрылады:
нұсқа_түрі ат_түрі: базалық_класстардың_тізімі
{ компоненттер (мүшесі) классы }
Класстың компоненттері компонент мәліметтері және компонент
функциясы болуы мүмкін. Компонент функциясы объектілі мәліметтерін
операциясын орындау үшін берілген, оларды жиі класстар әдісі деп
атайды.
Әрбір класс компоненттері үшін кіру деңгейі орналасады немесе
бір кілттік сөз public, protected немесе private екілік кіру
деңгейі көрсетілген. Барлық келесі компоненттер классына көрсетілген
кіру деңгейі қарасты public деңгейі компоненттік классқа
бағдарламаның кез келген орнына орнатуға рұқсат берілген және бұл
класстың айнымалысы белгілі болса ғана жұмыс атқарады. Private кіру
деңгейі компоненттік класстарға тек қана бұл класстың әдісі
бойынша кіруге рұқсат береді. Protected кіру деңгейі тек қана
мағынасы бойынша иерархиялық класстар жүйесі және туынды әдіс
класстарына осы деңгейдің компоненттеріне кіруге рұқсат береді.
Struct барлық компоненттер класының түрі үндемей public кіру
деңгейіне алынады, бірақ басқа да кіру деңгейлеріне тапсырма беруге
болады, class класс компоненттері түріне үндемей кіру деңгейі
private, union класс түріне кіру деңгейі public және ол
өзгертілмеген және де басқа да кіру деңгейлерін анықтауға болады.
Мысалы, программист TPoint ( нүкте ) классын шешті дейміз,
сыртқы нүктенің координаттарына кіруге рұқсат бермеген және сыртқы
жазықтықтағы нүктелерін жылжыту әдісіне рұқсат етілген. TPoint
классын мынадай қылып анықтауға болады:
class TPoint
{ private :
int x , y ;
public :
void movePoint ( int newx , int newy ); жаңа нүктеге
void relmove ( int dx , int dy ); dx қызметтен алу , dy
int getx ( void )( return x ;};
int gety ( void ){ return y ;};
};
Функцияның компоненттерін анықтау классында өшірілуі мүмкін,
функция getx және gety мысалысында көрсетілген немесе анықтау
классында көрсетілмеген. Функция компоненттін шықыру барысында
қосымша аргумент алу – шақырылған функция және көрсетілген функция
беттеріне барлық компоненттер классы көрсетілген анықталмаған
объектілік түрде жүреді. Компоненттер функциясының көрсетілімін
анықтау классынан тыс рұқсат берілген контексттік операциясын
қолдану, бұл функцияның классқа тиісті екенін компиляторға
хабарлайды. TPoint классының әдісін былай жазуға болады:
void TPoint : : movePoint ( int newx, int newy )
{ x = newx; y = newy ; }
void TPoint : : relmove ( int dx, int dy )
{ x += dx; y += dy ; }
Компонент – осы бастапқы инициялизацияны орындау үшін
өзгерткіштердің түрі баяндау объектті түрді арнайы әдістер –
конструкторларды қосады. Конструктор аты түрдің атымен сәйкес
келеді. Қайталанатын мағына түрінің ешқашан мағыналары көрсетілмейді
және конструктор ол үшін қайтарып бермейді. Жоғары TPoint классын
көру үшін конструкторсыз жұмыс істеуге болады және movePoint
инициялизация әдісін қолдану. TRect классын мысал ретінде көріп
шығамыз, тік бұрыш жақтарымен бейнелеуші, параллельді
координаттарының өстері:
enum Boolean {FALSE, TRUE };
class TRect
{ public:
TPoint a,b; a - сол жоғарғы бұрыш , b - оң төменгі бұрыш
void move( int dx, int dy) тікбұрыштың ауыспалылығы
{ a.relmove ( dx, dy ); b.relmove ( dx, dy );}
void grow( int dx, int dy) размерлердің өзгертілуі
{ a.x +=dx; a.y += dy; b.x +=dx; b.y += dy; }
void intersect (const TRect& r); екі тікбұрыш жалпы бөлімі
void Union ( const TRect& r); * Тікбұрыш , қамтылған екі
тікбұрыш *
Boolean contains ( const TPoint& p);
* TRUE, егер p нүктесі тікбұрышта жатса *
Boolean isEmpty( );
* TRUE, егер ені немесе тікбұрыш биігі нольге тең
болса *
TRect (int ax, int ay, int bx, int by ) конструктор
{ a,x - ax; a,y = ay; b.x = bx; b.y = by; };
TRect ( TPoint p1, TPoint p2) конструктор
{ a = p1; b = p2; };
TRect () конструктор
{ a.x = a.y = b.x = b.y = 0; };
};
* Класстың әдісі TRect *
void TRect : : intersect (const TRect& r)
{ a.x = max (a.x, r.a.x ); b.x = min ( b.x, r.b.x );
a.y = max (a.y, r.a.y ); b.y = min ( b.y, r.b.y );
};
void TRect : : Union ( const TRect & r )
{ a.x = ( a.x = r.a.x ) ? a.x : r.a.x ;
a.y = ( a.y = r.a.y ) ? a.y : r.a.y ;
b.x = ( b.x = r.b.x ) ? b.x : r.b.x ;
b.y = ( b.y = r.b.y ) ? b.y : r.b.y ;
};
Boolean TRect : : contains ( const TPoint & p )
{ return Boolean (p.x = p.x && p.x b.x && p.y = a.y && p.y
b.y); };
Boolean TRect : : isEmpty ( )
{ return Boolean ( a.x = b.x a.y = b.y ); };
Толық түрдегі хабарлар объектілі түрдің конструкторлары туралы
көбірек келесі бөлімдерде көрсетілген.
Өзгергіш объектілі түрдің жариялануы жалпы ережелермен
құрылады, бірақ конструктор классында өзгергіш идентификаторын
жақшалардың ішінде аргументтерін анықтауға және көрсетуге болады:
TRect r1(2,4,20,50); инициализация бірінші конструктордың
қолдануымен
TRect *pr = &r1; TRect көрсеткіші
TRect r2, *ptr; r2 үшін конструктор параметрсіз
қолданылады
Орналастыруға арналған new операциясында объектті өзгерткіш
динамикалық жады түр атының және мына түр конструктор аргументтерін
қатар көрсетеді:
ptr = new TRect( 7,3,18,40);
Объектті түрдің компоненттеріне айналдыруға арналған аты оған
компоненттер объектті өзгергіш атпен немесе көсеткішпен анықтау:
r1.grow( 2, -3);
pr-move( 1, 1);
Boolean bb= r1.isEmpty( );
Конструкторлар және деструкторлар
Класстың түсіндірмесі арнайы әдістерін әдеттегідей қолданады,
шақырушылар өзгергіш мына классты құру және динамикалық жадыдан -
конструкторларды және деструкторлардың өзгерткіштерін жою. Конструктор
жад өзгергіш және компонент мәліметтерінің инициялизациясын
қамтамасыздандырады, бөлінімінен кейін шақырылады, ол үшін деструктор
жад босатылуынан алдын ала шақырылады, орын иеленген объектілі
өзгергіштің және қосымша әрекеттердің орындалу үшін арналған
байланысқан объектілі өзгерткіштерін жою, мысалы, жад босауына
арналған, бөлінген объектіге арналған учаскенің сырсында,
компоненттің мәліметтерін апару.
Белгілерген конструктордың әрқашан аты болады, классатымен
сәйкес келуші, ешқандай мағыналар қайтарылып берілмейді қайтарылатын
мағына түр және ол үшін көрсетілмейді. Барлық компонент
мәліметтерін конструктор инициализациясын қамтамасыздандыру керек.
Классқа арналған конструктордың бірнеше мүмкіндігі белгілі, санмен
айыратындардың және параметрлердің түрлерін қолданады. Жалпы жағдайда
конструкторлардың келесі түрлерін айырып таниды: конструктор
парамтрлерімен, конструктор параметрлерісіз және көшіріп алу
конструкторлары бір параметрлі – осы объектілі түрдің сілтеме мен
өзгерткішті таниды. Егер объектілі түр бір де бір конструкторы
анықталмаса, компилятор конструкторды үндемей құрып береді және ол
параметрсіз қолданылады. Көшіріп алу конструкторы қажетті, егер
өзгергіш объектілі түрдің қандай да болмасын функция аргумент
түрінде берілсе, сондықтан барлық аргументтер функцияға мәні жағынан
беріледі.
Деструктор қажетті, егер объектілі түр компоненттерге
берілгендер берілсе, динамикалық берілгендер көрсеткіш болатын болса,
өзгергіш объектіні жою барысында жоюылуы керек. Деструктор
әрқашанда сол аты болады, класстың атына байланысты сол атпен,
бірақ аттың берілу атында (тильда) ~ белгісі жазылады. Деструктордың
параметрі болмайды және ұқсас конструкторға ешқандай мағына
қайтарылып берілмейді.
TString объектілі түрін мысал ретінде қарастырамыз, ол үшін
қателерден жоғары дәрежеде қорғалған, реттелген мәліметтер
көрсетіледі, string.h. файл – тақырыбшалары қатарларын өңдеп
стардарттық функциялармен қамтамасыздандырады.
include iostream.h
include string.h
class TString
{ public:
TString(); конструктор параметрлерсіз
TString(int n, char* s=0); конструктор , бос жолды
жасаушы * конструктор , TString түрінде нольмен аяқтайтын char
массивті қайта құрушы *
TString(char* s);
TString(TString& st); көшіріп алу конструкторы
~TString(); деструктор
void print(); экранға жол шығаруы
int sz; жол ұзындығы
char* ps; жол сақтауына арналған
жадқа көрсеткіш
};
* TString сынып әдістері *
TString::TString( ){sz=0; ps=0;}
TString::TString(int n, char* s)
{ sz=n; ps=new char[n+1];
strncpy(ps,s,n); ps[sz]='\0';
}
TString::TString(char* s)
{ sz=strlen(s)+1; ps=new char[sz];
strcpy(ps,s);
}
TString::TString(TString& str)
{ sz = str.sz; ps=new char[sz+1];
strcpy(ps,str.ps);
}
TString::~TString( )
{ if (ps != 0) delete [] ps; }
void TString::print( )
{ if (sz == 0 )
{ cout " Бос жол " endl; return;}
cout" Жол = " ps endl;
}
Бағдарламалар төмен түрде келтірілген , TString түрінің көрнектейтін
берілгендерді қолдану.
int main()
{ char rabstr [60] = "yes";
while (*rabstr !='n')
{ cin rabstr;
if (*rabstr == 'n')break;
TString s1();
TString s2(6);
TString s3(6, rabstr);
TString* ps1=new TString("мынау жол көрсеткішпен ");
cout " s1="; ps1-print();
cout " s2="; s2.print();
cout " s3="; s3.print();
}
return 0;
}
Конструктор түрлендіруін оңайлатуға болады, егер компоненттік
мәліметтер базалық түрге қарасты немесе өзгергіш объектілі
конструкторының бар болуы. Функция тақырыбшасынан кейін
конструктордың түрленінен кейін қос нүкте болады және содан кейін
инициялизацияның тізімін идентификатор (аргумент) түрінде болады.
Мысалы, TPoint классында конструкторды дәл анықтауға болады:
class TPoint
( ... .
public:
TPoint ( int x0, int y0 ) : x (x0), y (y0){ };
}
Осы конструкторда барлық компоненттер инициализация тізімінен
мағыналарды алуға, ал конструктор денесі құрамында бос оператор
көрсетілген.
1.2 Класстар
Класстар иерархиялық құрылымда құрастырылады, кейбір базалық
класстар бөлінеді, ұқсас класстар топ әдістерін және туынды
класстарын барлық мәліметтерде сақтайды, осы мәліметтерге және
әдістерге базалық кластан мәліметтер мен әдістер қосылады, осылардың
барлығы туынды классты орындауға арналған. Класстардың жүйесінің
түрленуі былай:
class TA базалық класс
{ Өзгергіштер және әдістері TA }
class TAA : public TA Класс , TA туынды касстан
{ Өзгергіштер және әдістері TAA }
class TAAB : public TAA Класс, TAAB туынды касстан
{ Өзгергіштер және әдістері TAAB }
Базалық класстың компоненттерін кілттік сөзін public және
private басқаруға рұқсат береді. Егер базалық класс public болса,
онда класста public - компоненттері базалық класста public болып
қалады, protected – компоненттері базалық класста protected болып
қалады, private – компоненттері базалық класста туынды класстың
функцияларына рұқсат бермейді.
Егер базалық класс private болса, туынды класстың public және
базалық protected – компоненттері туынды класстың функцияларын
ұсынады, келесі туынды класстар үшін олар private деп саналатын
болады, бірақ бұларға рұқсат етілмейді, базалық класстың private –
компоненттері туынды классқа қолы жетпейді.
Туынды класс конструкторы базалық класстың өзіндік конструкторын
шақыру керек:
class TBase
{ public: TBase( int s, int m, int d);
* TBase сынып басқа компоненттері *
}
class TVect : public TBase
{ public: TVect ( int k, int s, int m int d): TBase(s, m, d)
{ * Қалған TVect компонентінің инициализациясы
*};
1.3 Виртуалдық функциялар
Функциялардың объектілі түрлерінің түрленуі үшін әртүрлі
класстардың ұқсас белгілері бар болуында, олар бірдей атпен болуы
мүмкін, олар параметрлердің түрлері және қайтарылған мағынада бола
алады. Мұндай функцияға шақыру нұсқау атымен объекттік компиляторға
белгілі, қандай аттас функциялар қолданылатынын біледі. Осы уақытта
туынды түрдің объекттілеріне базалық түр көрсеткішімен шақыруға
болады және компилятор этапында орнатуға болмайды, функция қандай
да бір туынды түрден шақырылуы керек. Бағдарлама кіру барысында
тексеру керек болады, қандайда түр объектісіне көрсеткіш сілтейді
және тексерулерден кейін керекті функцияны шақырады. Бұл әрекеттерді
"кейінгі" байланысулар деп атайды, "алдынғы" байланысулардан
айырмашылығы, компилятор этапында немесе байланыс редакциялардың
негізінде шақырылған функциялардың кіру адресс нүктесін орнатуға
болады. Объектілі – орентированных тілде мына келеңсіздіктерді
шешіміне арналған виртуалды әдістерді бағдарламалауда қолданылады.
Виртуалды функциялардың түсіндірмесі
Функция компоненттерінің классы virtual кілттік сөзін виртуалды
көрсеткішпен жарияланады. Функциялар компоненттері туынды класста,
базалық класстың ауыстырушы виртуалдық функциялары сол атпен
жариялануы тиім, сол параметрлердің тізімімен және түрдің
қайтарылған мағынасында, және ол базалық класстың функциясына тиісті
болуы керек. Егер туынды класстан жаңа туынды класстар мағлұмат
берілсе, кілттік virtual сөздің функциясының түрлендіруін жіберуге
болады.
Егер туынды класста функция жарияланулары сол атпен жоқ
болса, онда базалық класстың функцияларына шақырылатын болады.
Виртуалды функция мына форма түрде шақырылуы мүмкін:
virtual void print ( ) = 0;
Мұндай функция "таза" (pure) виртуалдық функция деп аталады,
ал объекттік түр және оны жариялауын ұстап тұратынды абстрактылы
объекттік түр деп атайды. Бағдарламада абстрактылы түрдің даналары
алмайды, мұндай түрлер тек қана туынды түрдің пайда болуында
қолданылады, туынды түр тағы да виртуалдық функцияның тазасын
анықтау керек болады немесе нақты әрекеттердің орындалу барысында
оны кәдімгі виртуалдық функция ретінде жарияланады.
Виртуалды функциялар әсіресе пайдалы әдіс классы көрсеткіш
арқылы класстың даналарында пайда болады, ал сол көрсеткіштің өзі
базалық классқа көрсеткіш түрі болады. Мысалы, TBase классында
print таза виртуалды функциясы жарияланған:
class TBase массивтердің барлық түрлеріне
арналған базалық класс
{int size, элемент размері
count, ағымдағы сандық элементтер
maxCount, байттарға бөлінген жад орны
delta; байттарға жадтың жетілдірілуі
char *pmem; бөлінген жадқа көрсеткіш
int changeSize(); жадтың қайта бөлінуі
protected:
void* getAddr( ){return (void*) pmem;};
void addNewItem(void*); массив соңында қосу
void error(const char* msg){cout msgendl;};
public:
int getCount() {return count;};
TBase(int s,int m,int d);
TBase();
TBase(TBase&);
~TBase();
virtual void print ( ) = 0; Таза виртуалды функция
};
Онда туынды класстарда print функциялары тиісті нақты әрекеттер
орындалуы мүмкін болады:
class TIntArray : public TBase
{ * Другие методы *
virtual void print ( );
}
class TRealArray : public TBase
{ * Другие методы *
virtual void print ( );
}
Бағдарламада, TIntArray класстың объектілері және TRealArray сол
класстың даналары құрылуға болады, көрсеткіш арқылы базалық
класстан пайда болу мүмкіншілігі:
TBase *pb;
TIntArray aint(5,3);
TRealArray areal(4,2);
Онда баспаға шығару үшін массив операторлары қолданыла алады:
pb = &aint; pb-print(); aint массив баспасы
pb = &areal; pb-print(); areal массив баспасы
Виртуалдық функцияға тағы да мысал келтірейік. Кейбір әуесқой
үй жануарларын және өзінің жақсы көретін жануарларын каталогқа
орналастыру үшін, барлық жануарлардың түрлеріне байланысты өзінің
Pet базалық класстарын анықтау үшін қолданылады. Қысқаша түрде
әрбір жануарға лақап және ірі жануарларды дауыс арқылы бөледі,
экранға лақаптарының және жануарлардың дауыстарының тізімін шығаруға
мүмкіндік береді.
Бағдарлама:
#include iostream.h
struct Pet Базалық класс
{ char *name;
virtual void speak() = 0;
Pet( char *nm){name=nm;}
}
struct Dog : public Pet
{ virtual void speak( ) { coutname“ сөйлейді “”“ Ав -
ав”endl; };
Dog(char *nm): Pet(nm) { };
};
struct Cat : public Pet
{ virtual void speak( ) { coutname“ сөйлейді “
“ Мяу-Мяу”endl;
Cat(char *nm): Pet(nm) { };
}
int main ()
{ Pet *mypets[ ] = { new Dog(“Шарик”),
new Cat(“Мурка”),
new Dog(“Рыжий “)}; Жануарлардың
тізімі
const int sz = sizeof( mypets) sizeof( mypets [ 0 ]);
for ( int k = 0: k sz; k++)
mypets [ k ]-speak();
return 0;
}
1.4 "Достар" ( friend ) функциялары
Функция, туынды класста жариялайды, тек қана қорғалған
(protected) рұқсат беріледі немесе жалпы ( public ) базалық класстың
компоненттеріне.
Функция, класстың сыртында тек қана жалпыға ( public )
компоненттер классына және ат бойынша сұрау, объектінің атпен
анықталған немесе объектінің көрсеткіші арқылы жарияланады.
Функцияда кейбір объектілік Х класстардың компоненттеріне жеке
рұқсат алу үшін, оларға қатысты рұқсат алмаған, бұл функция Х
класста достар деп шығарылуы керек:
class X
{ friend void Y:: fprv( int, char*);
*Басқа Х класстың компоненттері *
}
Барлық класстың Ү, Х класстың достық функцияларын шақыруға
болады:
class Y;
class X
{ friend Y;
* Басқа Х класстың компоненттері *
}
class Y
{ void fy1(int, int);
int fy2( char*, int);
* Басқа Ү класстың компоненттері *
}
Достар функцияда да болуы мүмкін, қандайда бір класстың
компонентті емес, мысалы:
class XX
{ friend int printXX ( );
* Басқа ХХ класстың компоненттері *
}
Осы print XX функциясы барлық ХХ ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz