Обьеткіге бағытталған бағдарламалау.

Автор работы: Пользователь скрыл имя, 17 Февраля 2015 в 04:59, курсовая работа

Описание работы

Қазіргі уақытта программалуда 3 концепция белгіленген:
 объектілі бағытталған программалау; (ОБП)
 унификацияланған модельдеу тілі (UML)
 программалық қамтамаларды құру арнайы жабдықтары.

Файлы: 1 файл

Обьеткіге бағытталған бағдарламалау.docx

— 55.61 Кб (Скачать файл)
  1. Құрылымдар және кластар

Құрылымдарды класс ретінде де қолдануға болады. Құрылым мен кластың формальды айырмашылығы мынада: келісім бойынша кластың барлық мүшелері жасырын болады, ал құрылымның барлық мүшелері ашық болады.

рrivate қызметші сөзін класс мүшелері үшін көрсету міндетті емес: 
class foo class foo 
{ private: { int data1; 
int data1; public: 
public: void func ( ); 
void func ( ); }; 
}; 
Құрылым үшін public қызметші сөзі келісім бойынша беріледі. 
struct foo 
{ void func ( ); 
private: 
int data1; 
}; 
Программистер құрылымды берілгендерді біріктіру үшін, ал кластарды берілгендер мен функцияларды біріктіру үшін қолданады.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Кластар, объектілер және жады

Әрбір объектінің өзінің тәуелсіз берілгендер өрісі болады. Бір кластың барлық объектілері бір әдісті қолданады. 
Класты құру кезінде класс әдісі құрылады және бір-ақ рет компьютер жадысына орналастырылады. Әрбір объектінің өз мәндер жинағы бодады, объектілер өрістері жалпы боламуы керек. Объектілерді құруда әрбір берілгендер жинағы жадыдан белгілі бір бос орын алады. 
Объект 1 Объект 2 Объект3

data1 data1 data1

data2 data2 data2

function1

function 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Кластың статикалық берілгендері

Егер кластың берілгендер өрісі static қызметші сөзімен сипатталса, онда бұл өрістің мәні сол кластың барлық объектілері үшін бірдей болады. Кластың статикалық берілгендері барлық объектілер қандай да бірдей мәндерді бірлесе қолданғанда пайдалы. 
Статикалық өріс өз мінездемесі бойынша статикалық айнымалыға ұқсас: ол класс ішіде ғана көрінеді, ал оның өмірінің уақыты программаның өмір сүру уақытымен сәйкес келеді. Бірде бір класс объектісі болмаса да, статикалық айнымалысынан өзгешелігі – кластың статикалық өріс бар болады.

Кластың статикалық айнымалысын қолдану мысалын қарастырайық.

Берілген мезетте әр объекті өзі сияқты жадыда қанша объект бар екендігін білу қажет болсын. Бұл жағдайда класқа count есімді статикалық айнымалыны енгізіеміз. count айнымалысын барлық объектілір көре алады және олардың бәрі бірдей мәнді көреді.

// statdata. cpp 
# include < iostream. h> 
class foo 
{ private: 
static int count; 
public: 
foo ( ) 
{ count ++;} 
int getcount ( ) 
{ return count; } 
}; 
int foo : : count = 0; // count анықтамасы 
int main( ) 
{ foo f1, f2, f3; 
cout << ”Объект саны = “ < cout << “Объект саны = “ < cout << “Объект саны =” < return 0; }

f1, f2, f3 объектілері үшін main( ) функциясында конструктор үш рет шақырылады, count өрістерін инкременттеу де үш рет болады. 
getcount ( ) әдісі count –ты қайтарады. Барлық жағдайда да бұл әдіс бір мәнді қайтарады. 
Объект саны =3 
Объект саны =3 
Объект саны =3 
Егер статикалық емес, автоматты count өрісін қолдансақ, онда конструктор әр объекті үшін бұл өрістің мәнін бірге арттырар еді. 
Объект саны =1 
Объект саны =1 
Объект саны =1

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Класс өрістерінің жеке-жеке жариялануы және анықталынуы

 

Статикалық өрістерді анықтау жай өрістерді анықтау тәрізді жүргізілмейді. Жай өрістертер жарияланады, яғни компиляторға оның есімі және типі хабарланады, содан соң анықталады, яғни компилятор айнымалыға типіне сәйкес жадыдан орын бөледі. Осының бәрі жалғыз ғана сипаттаудың көмегімен жүргізіледі. Ал статикалық өрістер үшін көрсетілген әрекеттер екі оператордың көмегімен жүргізіледі. Өрісті жариялау кластың ішінде жүргізіледі, ал оны анықтау кластың сыртында орындалады.

Егер статикалық өрістің анықталуы кластың ішінде орналасса, онда класты анықтау оған жадыдан орын бөлуді көрсетпейді деген қағиданы бұзған боламыз. Сондықтан статикалық өрістің анықталуын кластың сыртында орналастыру арқылы программа орындалуын бастағанға дейін оған жадыдан бір рет қана орын бөлінеді.

Объект 2 
Объект 1 Объект 3

Автоматты Автоматты Автоматты 
өрістер өрістер өрістер 
data1 data1 data1

data2 data2 data2

Статикалық өрістер 
data3

data4

Статикалық өрістермен кең ауқымды айнымалырадың арасында ұқсастық бар. Статикалық өрістермен жұмыс істеу барысында компилятор тани алмайтын оңай қателіктер жіберуге болады. Егер стаикалық өріс класта жарияланып, бірақ анықталмаса компилятор ескерту хабарламасын бермейді. Байланыстырушы редакторы бұл қатені анықтағанша программа қатесіз деп есептелінеді. Байланыстырушы редактор «анықталмаған кең ауқымды айнымалыны қолдануға ұмтылу» деген хабарламаны шығарады.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Тұрақты әдістер

 

Тұрақты әдістер кластың өрістерінің мәндерін өзгертпейді. 
//constfu.cpp 
class aClass 
{ private: int alpha; 
public: void nonFunc( ) 
{alpha=99;} 
void conFunc ( ) const //қате 
{alpha=99;} 
}; 
Функцияны тұрақты ету үшін оның прототипінен кейін, бірақ денесінің алдында const қызметші сөзін жазу керек. Егер функцияның жариялануы және анықталынуы бөлек берілсе, онда const модификаторы екі рет жазылады. Тек кластың өрістерінің мәндерін оқитын әдістерді тұрақты әдістер ретінде қолдану тиімді. 
Мысалы, Distance класының showdist() әдісін тұрақты ету керек. Сол сияқты engeset.cpp программасындағы add_dist() әдісі де берілгендердің мәндерін өзгертпеу керек. Егер функция аргументін сілтеме арқылы беріп, сонымен қатар оның мәнін өзгертпеу крек болса, онда аргументті тұрақты ету керек. Ол үшін add_dist() әдісінің d2 параметрі const модификаторымен сипатталған. 
//engeconst.cpp 
#include 
class Distance 
{private: 
int feet 
fleat inches; 
public: 
Distance ():feet (0), inches (0.0) 
{} 
Distance (intft,float in): feet (ft), 
Inches (in) 
{} 
void getdist( ) 
{cout<>feet; 
cout<> inches; 

void showdist( ) const 
{cout< Distance add_dist (const Distance &) const; 
}; 
Distance Distance : : add_dist (const Distance &) const; 
{ Distance temp; 
// feet=0; ошибка 
// d2.feet=0 ошибка 
temp.inches = inches + d2.inches; 
if (temp.inches >= 12.0) 
{temp.inches — = 12.0; 
temp.feet = 1; 

temp.feet + = feet + d2.feet; 
return temp; 

int main ( ) 
Distance dist1, dist3; 
Distance d2 (11, 6.25); 
dist1.getdist ( ); 
dist3 = dist1.add_dist (dist2); 
cout<< ” dist1=”; dist1. showdist ( ); 
cout<< ” dist2=”; dist2. showdist ( ); 
cout<< ” dist3=”; dist3. showdist ( ); 
cout << endl; 
return 0; 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Тұрақты объектілер

 

const модификаторын объектілерге де қолдануға болады. Егер объект const модификаторымен сипатталса, онда оны өзгертуге болмайды. Мұндай объектілер үшін тек тұрақты әдістерді ғана шақыруға болады. Мысалы: 
// constObj.cpp 
# include 
class Distance 
{ private: 
int feet 
fleat inches; 
public: 
Distance (intft,float in): feet (ft), inches (in) 
{} 
void getdist ( ) 
{cout<>feet; 
cout<> inches; 

void showdist ( ) const 
{cout << feet<< ” ’-“ << nches < ’ ” ’;} 

int main( ) 
{const Distance football (300,0); 
// football.getdist( ); — қате 
cout<< ” Длина поля = ”; football.showdist( ); 
cout< return 0; 

Американдық футбол алаңының ұзындығы 300 футқа тең. football объектісі — тұрақты объект. Сондықтан тек тұрақты әдістерді ғана шақыра аламыз.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Операцияларды асыра жүктеу

Операцияларды асыра жүктеу — объектілі бағытталған программалаудың ең күрделі мүмкіндіктерінің бірі. 
Жаңа кластарды құру және операцияларды асыра жүктеу С++ тілінің мүмкіншілігін кеңейтуге жол ашады. Жаңа кластар үшін операцияларды асыра жүктеу арқылы программистер жаңа өз тілін құра алады.

Унарлы операцияларды асыра жүктеу

Унарлы операцияның тек бір ғана операндасы болады (операнд дегеніміз операция әрекет жасайтын айнымалы). Унарлы операцияның мысалы ретінде инкрементті, декрементті алуға болады. 
Алдыңғы тақырыптарда қарастырылған Counter класының с1 объектісі қосқышының мәнін 1-ге арттыру үшін с1.inc_count() әдісі шақырылған болатын. 
Программа мәтіні түсінікті болу үшін ++с1 жазуы ыңғайлы болар еді. Осы операцияны асыра жүктеу программасын қарастырайық. 
// countpp1.cpp 
# include 
class Counter 
{ private: 
unsignet int count; 
public: 
Counter ( ) : count (0) 
{} 
unsigned int get_count(0) 
{return count;} 
void operator ++( ) 
{++count;} 
}; 
int main ( ) 
{ Counter c1, c2; 
cout << ” n c1 = “ < cout << ” n c2 = “ < ++c1; 
++c2; 
++c2; 
cout << ” n c1 = “ < cout << ” n c2 = “ < count << endl; 
return 0; 

Жауабы: с1=0 
с2=0 
с1=1 
с2=2 
++ операциясын асыра жүктеу үшін operator қызметші сөзі қолданылған. 
Алдымен қайтарылатын тип көрсетіледі (біздің жағдайда void типі), содан соң operator қызметші сөзі, кейін операция белгісі ++ және жақша ішінде көрсетілген аргументтер тізімі жазылады. Біздің жағдайда жақша іші бос. Бұл синтаксис компиляторға программа мәтінінде ++ операциясының операнды Counter класына тиісті болса осы функцияны шақыру керектігін көрсетеді. 
Компилятор асыра жүктелген функцияларды берілгендер типтеріне және аргумент сандарына қарай ажыратады. Сол сияқты асыра жүктелген операцияларды операндалардың типтеріне қарай ажыратады. 
Біздің жағдайда operator ++( ) функциясының аргументтері жоқ. Олай болса бұл операция нені өсіреді? Ол операцияны шақырып тұрған объектінің count өрісінің мәнін өсіреді. Класс әдістерінің өзін шақырып тұрған осы кластың объектісін көре алатындықтан операция үшін аргументтің қажеті жоқ. 
countpp1.cpp программасындағы operator++() функциясының кішкене кемшілігі бар. Егер біз с1 = ++ с2; меншіктеу операторын жазсақ компилятор қате береді. Себебі operator ++() функциясы void типін қайтарады. Ал меншіктеу операторы Counter типін қайтаруын сұрайды. Яғни меншіктеу өрнектерінде operator ++() функциясын қолдану үшін қайтарылатын типті дұрыс анықтауымыз керек. Мысалы: 
// countpp2.cpp 
# include < iostream.h > 
class Counter 
{ private: 
unsignet int count; 
public: 
Counter ( ) : count (0) 
{} 
unsigned int get_count(0) 
{return 0;} 
Counter operator ++( ) 
{++count; 
Counter temp; 
temp. count = count; 
return temp; 

}; 
int main ( ) 
{ Counter c1, c2; 
cout << ” n c1 = “ << c1. get_count ( ); 
cout << ” n c2 = “ << c2. get_count ( ); 
++c1; 
c2 = ++c1; 
cout << ” n c1 = “ << c1. get_count ( ); 
cout << ” n c2 = “ << c2. get_count ( ); 
count << endl; 
return 0; 

Программаның бұл мәтінінде operator ++() функциясында Counter класына тиісті жаңа объект анықталған. Объект алдымен өзінің count өрісінің мәні арттырады, содан соң temp объектісінің count өрісіне меншіктелініп, негізгі программаға қайтарылады. temp объектісін қолдану үшін программа мәтінінде 3 жол қажет болды. Осы әрекеттерді орындау үшін есімсіз объектіні қолданатын тағы бір әдіс бар. 
// countpp3.cpp 
# include 
class Counter 
{ private: 
unsignet int count; 
public: 
Counter ( ) : count (0) 
{} 
Counter (int c) : count (c) 
unsigned int get_count (0) 
{return count;} 
Counter operator ++( ) 
{++count; 
return Counter (count); 

}; 
int main ( ) 
{ Counter c1, c2; 
cout << ” n c1 = “ << c1. get_count ( ); 
cout << ” n c2 = “ << c2. get_count ( ); 
++c1; 
c2 = ++c1; 
cout << ” n c1 = “ << c1. get_count ( ); 
cout << ” n c2 = “ << c2. get_count ( ); 
count << endl; 
return 0; 

Программа мәтініндегі 
return Counter (count); 
жолы типі Counter есімсіз объект құрып негізгі программаға қайтарады. Бұл объект басқа еш жерде қолданылмайтындықтан объект есімсіз болып тұр. Объектінің мәні count параметрінің мәнімен анықталған. Көрсетілген жол дұрыс жұмыс істеу үшін бір аргументі бар конструктор алдын-ала анықталынуы керек.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Постфиксті операция

Мәні қолданылып болғаннан кейін мәнін арттыратын постфиксті операция үшін асыра жүктеуді қалай орындау керек екендігін қарастырайық. ++ операциясын асыра жүктеудің екі әдісін келтірейік. 
// postfix.cpp 
# include < iostream.h > 
class Counter 
{ private: 
unsignet int count; 
public: 
Counter ( ) : count (0) 
{} 
Counter (int c) : count (c) 
unsigned int get_count (0) 
{return count;} 
Counter operator ++ ( ) 
{return Counter (++ count);} 

Counter operator ++( int ) 
{return Counter (++count ++); 

}; 
int main( ) 
{ Counter c1, c2; 
cout << ” n c1 = “ << c1. get_count ( ); 
cout << ” n c2 = “ << c2. get_count ( ); 
++c1; 
c2 = ++c1; 
cout << ” n c1 = “ << c1. get_count ( ); 
cout << ” n c2 = “ << c2. get_count ( ); 
c2 = c1++ 
cout << ” n c1 = “ << c1. get_count ( ); 
cout << ” n c2 = “ << c2. get_count ( ); 
return 0; 

Мысалда operator ++() функциясының екі түрі бар. 
Counter operator ++ ( ) және 
Counter operator ++ ( int ) 
Бұл жерде int аргумент ролін атқармайды. Компилятор үшін ++ операциясының постфиксті версиясын қолдану жөнінде белгі болып табылады. Программаның орындалу нәтижесінде келесі нәтижелерді аламыз: 
с1=0 
с2=0 
с1=2 
с2=2 
с1=3 
с2=2 
Арифметикалық операциялар

Осы уақытқа дейін Distanse класының объектілерін қосу үшін add_dist() әдісі қолданылып келді: 
dist3.add_dist(dist1, dist2); 
+ операциясын асыра жүктеу арқылы келесі түрде жазуға болады: 
dist 3 = dist1 + dist2; 
// engplus. cpp 
# include 
class Distance 
{ private: 
int feet; 
float inches; 
public: 
Distance ( ) : feet (0) , inches (0) 
{ } 
Distance ( int ft , float in ) : feet (ft) , inches ( in) 
{ } 
void getdist ( ) 
{ cout << ” n Футты енгізіңіз = “ ; cin >> feet; 
cout << “ n Дюймді енгізіңіз = “; cin >> inches ; 

void showdist ( ) 

cout << feet << ” ‘ – “ << inches << ‘ “ ‘;} 
Distanse operator + ( Distanse ) const; 
}; 
Distanse Distanse: : operator + ( Distanse d2) const; 
{ int f = feet + d2. feet; 
float i = inches + d2. inches; 
if (i >= 12.0) 
{ i — = 12.0 
f ++; 

return Distance(f, i); 
int main ( ) 
{ Distance dist1, dist3, dist4; 
dist1. getdist ( ); 
Distance dist2 (11, 6.25); 
dist3 =dist1+ dist2; 
dist 4 = dist1 + dist2+ dist3; 
cout << ”dist1 = “; dist1. showdist ( ); cout << endl; 
cout << ”dist2 = “; dist2. showdist ( ); cout << endl; 
cout << ”dist3 = “; dist3. showdist ( ); cout < cout << ”dist4 = “; dist4. showdist ( ) ;cout << endl ; 
return 0; 

С++ тілінде страуктураның немесе класстың мүшесін алу операциясын (.), келісім беру операциясын (:: операция разрешения), шартты операцияны (?:), көрсеткіш бойынша берілгенді алу операциясын (->) асыра жүктеуге болмайды.

 

 

 

  1. Мұрагерлік

Мұрагерлік дегеніміз алдын-ала бар кластардан туынды кластарды құру. Алдын-ала бар класты негізгі (базалық) класс деп, ал мұрагер класты туынды класс деп атаймыз. Туынды класс негізгі кластың барлық мүмкіндіктерін қабылдаумен қатар, өзінің мүмкіндіктерінде дамыта алады. Бұл жағдайда негізгі класс өзгеріссіз қалады. Мұрагерлік бар кодты бірнеше рет қайталап қолдануа мүмкіндік береді. Туынды класты алу үшін класс есімімен кейін қос нүкте, содан соң public сөзінен кейін негізгі кластың есімі көрсетіледі. Біз кластың private және public бөліктерінің бар екендігін білеміз. Кластың ішінде рrivate бөліктердегі берілгендер мен әістерді көре аламыз. Ал сырттан тек public бөлігіндегі берілгендер мен функцияларды көруге болады.

Туынды кластар негізгі кластың private бөлігіндегі берілгендер мен функцияларды қолдана алмайды. Енді класқа қосымша тағы бір бөлік қосылады. Ол protected бөлігі. Бұл бөліктегі берілгендер мен функциялар туынды кластарға public бөліктегі берілгендер мен функциялар қоса көрінеді. Тек кластың ішінде ғана private бөліктегі берілгендер мен функцияларды көруге болады. Мысалы ,программада анықталған класс объектісі тек public бөліктегі берілгендер мен функцияларды қолдана алады.

Төменде мұрагерлікке байланысты көре алу кестесі берілген.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Мұрагерлік және көре алу кестесі

Көре (ала) алу спецификаторлары 
Кластың ішінде көру 
Туынды кластарда көру Сыртқы кластарда, функцияларда көру 
public Бар бар бар 
protected Бар бар жоқ 
private Бар жоқ жоқ

# include 
class Counter 
{ protected: 
unsigned int count; 
pablic: 
Counter ( ): count (0) 
{} 
Counter (int c ): count (0) 
{} 
unsigned int count ( ) 
{return count;} 
Counter operator ++( ) 
{return Count (++count);} 
}; 
class Count Dn: public Counter 
{ public: 
Counter operator — — ( ) 
{return Count (count — — );} 
}; 
void main ( ) 
{ Count Dn c1; 
cout << “ n c1=” << c1.get_count ( ); 
++c1; 
cout << “ n c1=” << c1.get_count ( ); 
— — c1; 
cout << “ n c1=” << c1.get_count ( ); 

CountDn класы Counter класының конструкторын қолдана алады, ал Count Dn класының объектілері үшін бұл жағдайда негізгі Counter класының бір аргументті конструкторын қолдануға болмайды. CountDn класы үшін конструкторды анықтаймыз: 
class Count Dn: public Counter 
{ public: 
Count Dn ( ): Counter ( ) 
{} 
Count Dn (int c): Counter (с ) 
{} 
Count Dn operator — — ( ) 
{return Count (- — count );} 
};

class А — класс әдістері өзінің ішіндегі private бөліктегі де, public бөліктегі берілгендерді көре алады;

Информация о работе Обьеткіге бағытталған бағдарламалау.