С++(ОБЪЕКТІЛІ-БАҒЫТТАЛҒАН ПРОГРАММАЛАУ)
Қазіргі уақытта программалуда 3 концепция белгіленген:
объектілі бағытталған программалау; (ОБП)
унификацияланған модельдеу тілі (UML)
программалық қамтамаларды құру арнайы жабдықтары.
Объектілі бағытталған программалау (ОБП) негізінде программа тізбектей орындалатын нұсқау ретінде емес, ұқсас қасиеттері және ұқсас орындайтын қызметтері бар объектілердің жиынтығы ретінде қарастырылады.
Барлық объектілі бағытталған программалау тілдерінің ішінде ең кең таралған С++ тілі. Осы бағытта соңғы пайда болған Java тілінің С++ тілімен салыстырылғанда келесі кемшіліктері бар: көрсеткіштер, шаблондар, бірнеше қайтара мұрагерлік Java тілінде қарастырылмаған. Барлық синтаксис жағынан бұл тілдер ұқсас.
Қазіргі таңда Microsoft және Borland компаниялары құрған С++ тілінің Microsoft Windows жүйесінде программалау ортасы көп тараған.
Объектілі бағытталған программалау үш тұжырымға негізделген: кластар, мұрагерлік және полиморфизм.
Процедуралық тілдерде жазылған программалар негізінен инструкциялар жиынтығы болып табылады. Бұл тілдердегі программалар функциялардан тұрады, олар тізбектелген іс-әрекеттер тізімін орындайды.
Бірнеше функцияларды модульдерге біріктіруге болады, бірақ сонда да процедуралық принцип сақталады.
Процедуралық тілдерде екі түрлі берілгендер типтері бар: жергілікті (локальді) және кең ауқымды (глобальді). Жергілікті берілгендер тек функциялардың ішінде және тек сол функцияларда ғана қолданылады, ал барлық функцияларда қолдану керек болса кең ауқымды етіп жариялайды. Функциялар мен берілгендер арасындағы күрделі байланыстар программаның құрылымын да күрделендіреді. Кең ауқымды берілгендерді функциялар шектеусіз қолдана алады. Бұл процедуралық тілдердің ең бір үлкен кемшілігі. Екінші кемшілігі, ол берілгендер мен функциялардың жеке-жеке қолданылуы. Бұл жағдайда нақты өмірдегі объектілерді дәл сипаттай алмаймыз. Мысалы егер объект машина болса, онда оның қасиеттері (мінездемесі) – двигательдің күші, есіктер саны болады, ал іс-әрекеті ретінде мысалы, тормозды басуды жатқызуға болады. Яғни қасиеттерге программада берілгендерді, ал іс-әрекеттерге программада функцияларды сәйкестендіруге болады. Іс-әрекет дегеніміз, объектінің сырттан берілген әсерге жауабы.
ОБП-дың негізгі идеясы – ол берілгендермен осы берілгендерге қолданылатын іс-әрекеттердің объект деп аталатын бір бүтінге бірігуі.
Объектілердегі функциялар С++ тілінде әдістер деп аталады. Егер объектінің кейбір берілгендерін оқу керек болса, онда осы әрекетті орындау үшін қолданылатын әдісті шақыру керек. Бұл әдіс берілгенді оқиды да оның мәнін қайтарады. Оның мәнін тіке, әдісті қолданбай ала алмаймыз. Яғни берілгендер кездейсоқ сыртқы әсерден қорғалған. Берілгендер мен функциялар инкапсуляцияланған (біріктірілген) делінеді.
Жасыру және инкапсуляция ОБП-дың негізгі терминдері болып табылады. Егер берілгенді өзгерту қажет болса, онда оны да объектінің әдісінің көмегімен орындау керек. С++ тіліндегі программа объектілер жиынтығынан тұрады. Олар бірінің бірі әдістерін шақыру арқылы бір-бірімен әрекеттерді орындайды.
объект
объект объект
Өмірде объект ретінде компанияның бөлімдерін – бухгалтерия, сату бөлімі, кадр бөлімі т.б. алуға болады. Компанияның бөлімдерге бөлінуі оны құрылымдық ұйымдстырудың маңызды бөлігі болып табылады.
Бөлімдердің арасында олардың орындайтын қызметтері үйлестіріледі және әр бөлім өзіне тиісті ғана ақпараттармен жұмыс атқарады: бухгалтерияда – еңбек жалақысымен, сату бөлімінде – әрбір маманға байланысты ақпараттармен т.б.
Бөлімдегі қызметкерлер тек сол бөлімге қатысты ақпараттармен ғана жұмыс істей алады. Бөлімдерге бөлу және олардың қызметтерінің белгіленуі компанияның жұмысын қатаң қадағалауға мүмкіндік береді.
Сату бөлімі
Кадр бөлімі Финанс бөлімі
Корпоративтік қатынас
ОБП программаның орындалу процесімен байланысты емес. Ол тек программаның ұйымдастыруына ғана қатысты.
ОБП тілінің негізгі эементтері:
Объект
Объект прогаммада қандай турде болуы мүмкін?
• Физикалық объектілер:
- көше қозғалысын модельдеудегі автомобильдер
- электр тогын модельдеудегі схема элементтері
- экономика моделін құрудағы елдер
- диспечерлік қызметін модельдеудегі ұщақтар
• Интерфейс элементтері:
- терезелер
- меню
- графиктік объектілер (сызықтар, тік төртбұрыш)
- маус, клавиатура, дискілік құрылғылар, принтерлер
• Берілгендер құрылымы:
- массивтер
- стектер
- байланысқан тізімдер
- екілік ағаштар
• Адамдар тобы:
- қызметкерлер
- студенттер
- сатып алушылар
- сатушылар
• Ақпараттар сақталуы
- құрал-саймандар тізімі
- қызметкерлер тізімі
- сөздіктер
- әлемдегі қалалардың географиялық координаттары
• Берілгендердің қолданушылар типтері:
- уақыт
- бұрыштардың шамасы
- комплексті сандар
- жазықтықтағы нүктелер
• Компьютер ойындарына қатысушылар:
- жарыстағы автомобильдер
- шахмат, дойбыдағы позициялар
- тірі табиғатпен байланысты ойындағы жануарлар
- ойындағы достар мен дұшпандар.
Кластар.
Барлық тілдерде стандартты типтер бар, мысалы int.
Кластар объектілер қандай берілгендер мен функциялардан тұратындығын анықтайтын форма болып табылады. Класты жариялау барысында ешқандай объект құрылмайды, мысалы int типі int айнымалының бар екендігін білдермейтін сияқты. Яғни класс өзара ұқсас объектілер жиынтығын сипаттау үшін қажет ұғым.
Класқа тиісті объекті кластың экземпляры деп аталады.
Мұрагерлік.
Класс ұғымы мұрагерлік ұғымына алып келеді.
С++ тілінде басқа кластарды анықтайтын класты негізгі класс деп атайды. Қалған кластар, оның қасиеттерін мұрагерлікке алады да, өздерінің қосымша басқа қасиеттерін қабылдайды. Оарды туынды класстар деп атайды. Құрылған класс басқа программаларда да қолданылуы үмкін. Бұл қасиет класс кодын қайталап қолдануға мүмкіндік береді.
Полиморфизм және асыра жүктеу.
Операциялар мен функциялардың олардың қолданып тұрған шамалардың типтеріне байланысты әр түрлі қызметтерді атқаруы полиморфизм деп аталады. Егер, мысалы, +, = операцияларын басқа жаңа типті операндалармен жұмыс істеу мүмкіндіктерімен қматамасыз етсек, онда бұл операцияларды асыра жүктелген операциялар деп атайды.
§2 Объектілер және кластар
Айнымалы өз типіне қандай қатынаста болса, объект те өз класына сондай қатынаста.
Класс анықтамасы class қызметші сөзінен басталып, класс есімі жазылады.
Құрылым сияқты, класс денесі фигуралық жақшаға алынып, «нүктелі үтір» белгісімен аяқталады.
ОБП –дың негізгі ерекшелігі берілгендерді жасыра алуы.
Бұл терминнің мағынасы мынада: берілгендер класс ішінде орналасқан және кластан тыс орналасқан функциялардың санкциясыз қолданылуынан қорғалған. Егер кейбір берілгендерді қорғау керек болса, онда оларды private қызметші сөзі бар класс бөлігінде орналастыру керек. Мұндай берілгендер тек класс ішінде ғана қолданылады. Public қызметші сөзімен сипатталушы берілгендер кластан тыс та қолданылады.
Кластың ішінде
қолданылады (жабық)
Кластан тыс (ашық)
қолданылады
Класс құрамына кіретін функциялар класс әдістері болып табылады.
Класс ішіндегі берілгендер мүшелер немесе класс өрістері деп аталады.
Келесі мысалды қарастырайық:
// smallobj. сpp
# include
class smallobj
{private:
int somedata;
public:
void setdata (int d)
{somedata = d;}
void showdata ( )
{ cout << " өрістің мәні = " << somedata << endl;}
};
int main ( )
{ smallobj s1,s2;
s1. setdata (1066);
s2. setdata (1776);
s1. showdata ( );
s2. showdata ( );
return 0;
}
setdata( ) и showdata( ) функциялары класс ішінде анықталған, яғни функция коды класс анықтамасында орналасқан. Осындай түрде анықталған класс әдісі кірістірілген анықтама болып табылады.
main ( ) фуекциясында s1, s2 екі объектісі анықталған. Объектіні анықтау объектіні сақтауға қажетті жады бөлу болып табылады.
Объект есімін класс әдісімен байланыстыру үшін нүкте (.) операциясын қолданады.
Нүкте операциясы класс мүшесін алу операциясы деп аталады.
Кейбір объектілі бағытталған программалау тілдерінде объект әдісін шақыруды хабарламалар деп атайды.
Мысалы:
// englobj.cpp
# include
class Distance
{ private:
int feet
sloat inches;
public:
void setdist (int ft, sloat in )
{feet = ft; inches =in;}
void getdist ( )
{cout << ”feet =”; cin>> feet;
cout << "inches =”; cin >> inches;
}
void showdist ( )
{cout << feet << "\’ " << inches < };
int main ( )
{Distanse dist1, dist2;
dist1. setdist (11,6.25);
dist2. getdist ( );
cout << ”\n dist1 = "; dist1. showdist ( );
cout << ”\n dist2 = "; dist2. showdist ( );
cout < return 0;
}
11 және 6,25 аргументтерімен шақырылған dist1 объектісінің өрістерінің мәні setdist() функциясының көмегімен беріледі, ал dist2 объектісінің өрістерінің мәнін getdist() функциясының көмегімен қолданушы енгізеді.
Englobj мысалы класс объектісінің өрістерін инициализацияау үшін класс әдісін қолданудың екі тәсілін көрсетеді. Объект өрістерін құру кезінде программа сәйкес тәсілді шақырудан гөрі, автоматты инициализациялау ыңғайлы.
Инициализациялаудың мұндай түрі – конструктор деп аталатын ерекше класс әдісінің көмегімен іске асырылады. Конструкторларда бірнеше ерекшеліктер бар. Біріншіден, конструктор аты класс атымен дәл сәйкес келеді. Екіншіден, конструкторда қайтарылушы мәні болмайды. Бұл конструктордың жүйе арқылы шақырылатындығымен түсіндіріледі. Яғни конструктордың мәнді қайтаратын программа немесе функцияның болмайтындығын көреміз. Конструктордың қызметі – класс объектісінің өрістерін инициализациялау.
Мысал 3:
// counter. cpp
# include < iostream. h>
class Counter
{ private:
unsigned int count;
public:
Counter ( ) : count (0)
{/*пустое тело*/}
void inc_count ( )
{ count++;}
int get_count ( )
{ return count; }
};
int main( )
{ Counter c1, c2;
cout << ”\n c1 = " < cout << ”\n c2 = " < c1. inc_count ( );
c2. inc_count ( );
cout << ”\n c1 = " < cout << ”\n c2 = " < count << endl;
return 0; }
Конструкторда инициализация әдіс прототипі мен функция денесінің арасында орналасқан және қос нүктемен ажыратылады. Инициализацияланатын мән өріс есімімен кейінгі жақшада орналасқан.
Counter ( ) : count (0)
{ }
Егер класс өрістерінің бірнешеуін инициализациялау керек болса, онда мәндер үтірмен бөлініп, инициализация тізімі құрылады.
Программа жұмысының қорытындысы:
с1=0
с2=0
с1=1
с2=2
Конструктордың дұрыс жұмыс істеп тұрғанына көз жеткізу үшін, хабарлама басуын талап етеміз:
Counter ( ) : count (0)
{cout << ” \n Конструктор \" ;}
Программа жұмысының нәтижесі:
Конструктор
Конструктор
с1=0
с2=0
с1=1
с2=2
Объект құрыларда ерекше класс әдісі – конструктор шақырылады. Объектіні жоюда автоматты түрде шақырылатын әдіс деструктор деп аталады. Деструктор есімі конструктор есімімен сәйкес келеді және есім алдында ~ тильда белгісі қойылады.
Объектілерді бірнеше тәсілмен жоя алмайтындықтан деструкторлар мәндерді қайтармайды және аргументтері болмайды.
Деструктордың негізгі жұмысы – объект құруда конструктормен бөлінген жадыны босату.
Class Foo
{ private:
int data;
public:
Foo ( ): data (0)
{ }
~ Foo ( )
{ }
};
Келесі мысалда асыра жүктелген конструктор, әдістердің кластың сыртында анықталуы, объектілерді функцияның аргументі ретінде қабылдауы көрсетілген.
// englcon. cpp
# include
class Distance
{ private:
int feet;
float inches;
public:
Distance ( ) : feet (0) , inches (0.0)
{ }
Distance ( int ft , float in ) : feet (ft) , inches ( in)
{ }
void getdist ( )
{
cout << ” \ n футы енгізіңіз = " ; cin >> feet;
cout << " \ n дюймды енгізіңіз = "; cin >> inches ;
}
void showdist ( )
{
cout << feet < void add_dist ( Distanse, Distanse ); // прототип
};
void Distanse: : add_dist ( Distanse d2, Distanse d3);
{ inches = d2. inches + d3. inches;
feet = 0;
if ( inches > = 12.0)
{ inches – = 12.0
feet ++;
}
feet + = d2. feet + d3. feet;
}
int main ( )
{ Distance dist1, dist3;
Distance dist2 (11, 6.25);
dist1. getdist ( );
dist3. add_dist ( dist1, dist2 );
cout << ”\n dist1 = "; dist1. showdist ( );
cout << ”\n dist2 = " ; dist2. showdist ( );
cout << ”\n dist3 = " ; dist3. showdist ( );
cout < return 0;
}
Мысалда бір Distance() есімімен берілген екі конструктор бар, сондықтан конструктор асыра жүктелген болып табылады.
Жаңа объект құрылыу кезінде қанша аргумент қолдануына байланысты қай конструктор орындалатындығы анықталады.
Класс ішінде класс әдісінің анықталуы міндетті емес.
Класс анықтамасының ішінде тек add_dist ( ) функциясының прототипі бар.
Функияның анықтамасы листингтің басқа жерінде болса да, ол класс әдісі болып табылады. add_dist ( ) функциясы Distance класынан кейін анықталады. add_dist ( ) функциясының есімі анықталарда Distance класының есімі және : : символы тұрады. Бұл белгі кең ауқымды келісім операциясының белгісі болып табылады.
Әдістің кластың сыртында анықталу форматы:
Қайтарылатын_мәннің_типі класс_есімі : : функция_есімі
{ }
: :-келісім операциясы.
Объектілерді функцияға берілу синтаксисі жай айнымалыларды беру синтаксисімен бірдей. Бірақ мынадай маңызды бөліктері бар:
Класс әдісіне әруақытта класс өрістерін қолдануға мүмкіндік бар (объект (.) операциясы арқылы әдіспен байланысады).
Класс әдісін басқа да объектілер қолдана алады. Олар оның аргументі түрінде қарастырылады.
Класс әдісінің әрбір шақырылуы осы кластың белгілі бір объектісімен байланысты (статикалық функцияны шақырудан басқа). Әдіс объектінің кез келген, ашық және жабық мүшелерін есімі арқылы тікелей ала алады. Сонымен қатар әдіс нүкте операциясы арқылы өз класының басқа объектілерінің мүшелерін де ала алады, олар әдіс аргументі ретінде қаралады.
add_dist ( ) функциясы мәндерді қайтармайды. Қайтарылатын мәннің типі
void болып табылады. Нәтиже автоматты түрде dist3 объектісіне меншіктеледі.
dist3
dist3 әдісі оның
берілгендерін
тікелей ала алады
dist3. aad_dist (dist1, dist2)
dist1 dist2
dist1. feet dist2. feet
dist1. inches dist2. inches
§3 Келісім бойынша көшірме конструкторы
Бұған дейін объектіні инициализациялаудың екі тәсілін қарастырдық. Аргументсіз конструктор объект өрістерін тұрақты мәндермен инициализациялай алады, ал ең болмағанда конструктордың бір аргументі болса өрістерді мәндермен инициализациялай алады.
Өрістерінің мәні анықталған объектіні қолданып объектіні инициализациялаудың үшінші түрі бар. Әрбір класты құратын компилятор үшін келісім бойынша көшірме конструкторы беріледі. Көшірме конструктордың бір ғана аргументі болады және конструктор сияқты сол кластың объектісі болып табылады.
// ecopycon. cpp
# include
class Distance
{ private:
int feet;
float inches;
public:
Distance ( ) : feet (0) , inches (0.0)
{ }
Distance ( int ft , float in ) : feet (ft) , inches ( in)
{ }
void getdist ( )
{
cout << ” \ n футты енгізіңіз= " ; cin >> feet;
cout << " \ n дюймды енгізіңіз = "; cin >> inches ;
}
void showdist ( )
{
cout << feet < };
int main ( )
{ Distance dist1 (11, 6.25);
Distance dist2 (dist1);
Distance dist3 = dist1;
cout << ”\n dist1 = " < cout << ”\n dist2 = " < cout << ”\n dist3 = " < cout < return 0;
}
dist2, dist3 объектілері келісім бойынша көшірме конструкторының көмегімен екі тәсілмен алынған.
§4 Функцияның объектілерді қайтаруы
Келесі мысалды қарастырйық:
// englret. cpp
# include
class Distance
{ private:
int feet;
float inches;
public:
Distance ( ) : feet (0) , inches (0.0)
{ }
Distance ( int ft , float in ) : feet (ft) , inches ( in)
{ }
void getdist ( )
{
cout << ” \ n футты енгізіңіз= " ; cin >> feet;
cout << " \ n дюймды енгізіңіз = "; cin >> inches ;
}
void showdist ( )
{
cout << feet < Distanse add_dist ( Distanse );
};
Distanse Distanse: : add_dist ( Distanse d2);
{ Distanse temp;
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 dist2 (11, 6.25);
dist1. getdist ( );
dist3. add_dist ( dist1, dist2 );
cout << ”\n dist1 = "; dist1. showdist ( );
cout << ”\n dist2 = " ; dist2. showdist ( );
cout << ”\n dist3 = " ; dist3. showdist ( );
cout < return 0;
}
temp
temp берілгендері
return add_dist;
операторының
көмегімен
dist3-ке меншіктеледі
dist3 = dist1. aad_dist (dist2)
dist1 dist2
feet d2.feet
inches d2.inches
§5 Құрылымдар және кластар
Құрылымдарды класс ретінде де қолдануға болады. Құрылым мен кластың формальды айырмашылығы мынада: келісім бойынша кластың барлық мүшелері жасырын болады, ал құрылымның барлық мүшелері ашық болады.
рrivate қызметші сөзін класс мүшелері үшін көрсету міндетті емес:
class foo class foo
{ private: { int data1;
int data1; public:
public: void func ( );
void func ( ); };
};
Құрылым үшін public қызметші сөзі келісім бойынша беріледі.
struct foo
{ void func ( );
private:
int data1;
};
Программистер құрылымды берілгендерді біріктіру үшін, ал кластарды берілгендер мен функцияларды біріктіру үшін қолданады.
§6 Кластар, объектілер және жады
Әрбір объектінің өзінің тәуелсіз берілгендер өрісі болады. Бір кластың барлық объектілері бір әдісті қолданады.
Класты құру кезінде класс әдісі құрылады және бір-ақ рет компьютер жадысына орналастырылады. Әрбір объектінің өз мәндер жинағы бодады, объектілер өрістері жалпы боламуы керек. Объектілерді құруда әрбір берілгендер жинағы жадыдан белгілі бір бос орын алады.
Объект 1 Объект 2 Объект3
data1 data1 data1
data2 data2 data2
function1
function 2
§7 Кластың статикалық берілгендері
Егер кластың берілгендер өрісі 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
§8 Класс өрістерінің жеке-жеке жариялануы және анықталынуы
Статикалық өрістерді анықтау жай өрістерді анықтау тәрізді жүргізілмейді. Жай өрістертер жарияланады, яғни компиляторға оның есімі және типі хабарланады, содан соң анықталады, яғни компилятор айнымалыға типіне сәйкес жадыдан орын бөледі. Осының бәрі жалғыз ғана сипаттаудың көмегімен жүргізіледі. Ал статикалық өрістер үшін көрсетілген әрекеттер екі оператордың көмегімен жүргізіледі. Өрісті жариялау кластың ішінде жүргізіледі, ал оны анықтау кластың сыртында орындалады.
Егер статикалық өрістің анықталуы кластың ішінде орналасса, онда класты анықтау оған жадыдан орын бөлуді көрсетпейді деген қағиданы бұзған боламыз. Сондықтан статикалық өрістің анықталуын кластың сыртында орналастыру арқылы программа орындалуын бастағанға дейін оған жадыдан бір рет қана орын бөлінеді.
Объект 2
Объект 1 Объект 3
Автоматты Автоматты Автоматты
өрістер өрістер өрістер
data1 data1 data1
data2 data2 data2
Статикалық өрістер
data3
data4
Статикалық өрістермен кең ауқымды айнымалырадың арасында ұқсастық бар. Статикалық өрістермен жұмыс істеу барысында компилятор тани алмайтын оңай қателіктер жіберуге болады. Егер стаикалық өріс класта жарияланып, бірақ анықталмаса компилятор ескерту хабарламасын бермейді. Байланыстырушы редакторы бұл қатені анықтағанша программа қатесіз деп есептелінеді. Байланыстырушы редактор «анықталмаған кең ауқымды айнымалыны қолдануға ұмтылу» деген хабарламаны шығарады.
§9 Тұрақты әдістер
Тұрақты әдістер кластың өрістерінің мәндерін өзгертпейді.
//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;
}
§10 Тұрақты объектілер
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 объектісі – тұрақты объект. Сондықтан тек тұрақты әдістерді ғана шақыра аламыз.
§11 Операцияларды асыра жүктеу
Операцияларды асыра жүктеу – объектілі бағытталған программалаудың ең күрделі мүмкіндіктерінің бірі.
Жаңа кластарды құру және операцияларды асыра жүктеу С++ тілінің мүмкіншілігін кеңейтуге жол ашады. Жаңа кластар үшін операцияларды асыра жүктеу арқылы программистер жаңа өз тілін құра алады.
Унарлы операцияларды асыра жүктеу
Унарлы операцияның тек бір ғана операндасы болады (операнд дегеніміз операция әрекет жасайтын айнымалы). Унарлы операцияның мысалы ретінде инкрементті, декрементті алуға болады.
Алдыңғы тақырыптарда қарастырылған 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 параметрінің мәнімен анықталған. Көрсетілген жол дұрыс жұмыс істеу үшін бір аргументі бар конструктор алдын-ала анықталынуы керек.
Постфиксті операция
Мәні қолданылып болғаннан кейін мәнін арттыратын постфиксті операция үшін асыра жүктеуді қалай орындау керек екендігін қарастырайық. ++ операциясын асыра жүктеудің екі әдісін келтірейік.
// 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;
}
С++ тілінде страуктураның немесе класстың мүшесін алу операциясын (.), келісім беру операциясын (:: операция разрешения), шартты операцияны (?:), көрсеткіш бойынша берілгенді алу операциясын (->) асыра жүктеуге болмайды.
§12 Мұрагерлік
Мұрагерлік дегеніміз алдын-ала бар кластардан туынды кластарды құру. Алдын-ала бар класты негізгі (базалық) класс деп, ал мұрагер класты туынды класс деп атаймыз. Туынды класс негізгі кластың барлық мүмкіндіктерін қабылдаумен қатар, өзінің мүмкіндіктерінде дамыта алады. Бұл жағдайда негізгі класс өзгеріссіз қалады. Мұрагерлік бар кодты бірнеше рет қайталап қолдануа мүмкіндік береді. Туынды класты алу үшін класс есімімен кейін қос нүкте, содан соң public сөзінен кейін негізгі кластың есімі көрсетіледі. Біз кластың private және public бөліктерінің бар екендігін білеміз. Кластың ішінде рrivate бөліктердегі берілгендер мен әістерді көре аламыз. Ал сырттан тек public бөлігіндегі берілгендер мен функцияларды көруге болады.
Туынды кластар негізгі кластың private бөлігіндегі берілгендер мен функцияларды қолдана алмайды. Енді класқа қосымша тағы бір бөлік қосылады. Ол protected бөлігі. Бұл бөліктегі берілгендер мен функциялар туынды кластарға public бөліктегі берілгендер мен функциялар қоса көрінеді. Тек кластың ішінде ғана private бөліктегі берілгендер мен функцияларды көруге болады. Мысалы ,программада анықталған класс объектісі тек public бөліктегі берілгендер мен функцияларды қолдана алады.
Төменде мұрагерлікке байланысты көре алу кестесі берілген.
Мұрагерлік және көре алу кестесі
Көре (ала) алу спецификаторлары
Кластың ішінде көру
Туынды кластарда көру Сыртқы кластарда, функцияларда көру
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 бөліктегі берілгендерді көре алады;
тиым салынған, яғни А класының объектісі
private бөліктегі берілгендерді көре алмайды.
А класының объектісі тек public бөліктегі
берілгендерді ғана көре алады.
obj A
Енді мұрагерлік жағдайдағы көру спецификаторларын қарастырайық:
class В базалық класы
Туынды класс D
class D: public
obj B
obj D
Кластар иерархиясы
Бір компанияның қызметкерлері жөнінде мәліметтер базасын құру керек болсын. Компаниядда қызметкерлердің үш категориясы жұмыс істесін, яғни менеджерлер, ғалымдар және жұмысшылар. Базада қызметкерлердің есімі және идентификциялық номерлері, сонымен қатар менеджерлер үшін олардың қызметінің есімі, гольф-клубқа төлейтін взностың нөмері, ғалымдар үшін олардың жарық көрген ғылыми еңбектер саны қажет болсын.
Бұл программаны құру үшін empogee базалық класын сипаттаудан бастаймыз. Класта қызметкердің фамилиясы және номері беріледі және оларды енгізу және шығару әдістері беріледі. Бұл кластан туынды manager, scientist және laborer кластары алынады. Олар қосымша ақпараттарды қабылдайды.
emplogee
- private
- public
manager scientist laborer
manager scientist laborer
foreman
foreman
Енді жұмысшылардың ішінде бригадир бар болатын болсын, онда туынды laborer класынан туынды foreman туынды класын аламыз. Бригадир жұмыс жоспарының орындалуын қадағаласын. Яғни туынды кластардан да туынды класты алуға болады.
#include
cons tint LEN=80;
class employee
{private:
char name[LEN];
unsigned long number;
public:
void getdata()
{cout<>name;
cout<>number;
}
void putdata() const
{cout< cout< }
};
class manager: public employee
{private:
char title[LEN];
double dues;
public:
void getdata()
{
empoyee::getdata();
cout<>title;
cout<>dues;
}
void putdata()
{
employee::putdata();
cout< cout< }
};
class scientist: public employee
{private:
int pubs;
public:
void getdata()
{
employee::getdata();
cout<>pubs;
}
void putdata()
{
employee::putdata();
cout< }
};
class laborer: public employee
{
};
class foreman: public laborer
{private:
float quotas;
public:
void getdata()
{
laborer::getdata();
cout<>quotas;
}
void putdata()
{
laborer::putdata();
cout< }};
int main()
{laborer l1;
foreman f1;
cout< l1.getdata();
cout< f1.getdata();
cout<<< l1.putdata();
cout< f1.putdata();
cout< return 0;
}
Кластың әдістерін алуды реттеп отыруға болады. Оның бірі туынды кластарды анықтау барысында. Осы уақытқа дейін туынды класты public сөзінің көмегімен алдық. Яғни туынды кластың объектілері базаық кластың public бөлігіндегі берілгендерді көре алады. Енді private сөзінің көмегімен де туынды кластарды анықтауға болады. Бұл жағдайда туынды кластың объектілері, базалық кластың public бөлігіндегі берілгендерді ала алмайды.
class A
class C: private A
class B:public A
obj A
obj B obj C
§13 Виртуальді әдістер
Виртуальді деген сөз көрінеді, бірақ нақты өмірде жоқ дегенді білдіреді. Виртуальді функцияларды қолдану барысында программа белгілі бір кластың функциясын шақырп тұрған сияқты, бірақ басқа кластың функциясы орындалады. Келесі мысалды қарастырайық.
#include
class Base
{public:
void show()
{cout< };
class Dev1: public Base
{public:
void show()
{cout< };
class Dev2 : public Base
{public:
void show()
{cout< };
void main()
{ Dev1 dv1;
Dev2 dv2;
Base* ptr;
ptr=&dv1;
ptr->show();
ptr=&dv2;
ptr->show();
}
Программада Dev1, Dev2 кластары – Base базалық класының туынды кластары. Әр класта show() функциясы анықталған. main() функциясында Dev1, Dev2 кластарының объектілері және Base класына көрсеткіш анықталған. Туынды кластың адресі базалық кластың көрсеткішіне меншіктелген. ptr->show() функциясы туынды класттың функциясын шақыру керек болып көрінгенмен, базалық класқа тиісті функция шақырылады. Программаны экранға келесі ақпарат шығарады:
Base
Base
Туынды кластардың функцияларын орындату үшін негізгі кластағы show() функциясының жариялануының алдына virtual қызметші сөзін жазамыз.
#include
class Base
{public:
virtual void show()
{cout< };
class Dev1: public Base
{public:
void show()
{cout< };
class Dev2 : public Base
{public:
void show()
{cout< };
void main()
{ Dev1 dv1;
Dev2 dv2;
Base* ptr;
ptr=&dv1;
ptr->show();
ptr=&dv2;
ptr->show();
}
Программаның орындалу нәтижесінде экранда
Dev1
Dev2
ақпаратын аламыз, яғни туынды кластың функцияларының жұмыс істегені көрініп тұр. Функциялардың бұлай шақырылуы кешіктіріліп байланыс құру деп аталады.
Объектілері ешқашан қолданылмайтын, бірақ туынды кластарды құру үшін қажет негізгі кластарды, яғни кластар иерархиясын құру үшін, абстракты кластар дейді. Абстракты класты ретсіз қолданудан программада қорғау үшін класқа таза виртуальді функция енгізеді. Таза виртуальді функция дегеніміз оның жариялануынан кейін ‘=0’ өрнегі көрсетілген функция. Жоғарыдағы мысалда Base класын келесі түрде анықтасақ
class Base
{public:
virtual void show()=0;
};
онда Base класының объектісін құру кезінде компилятор қате жөнінде хабарлама береді. Көп жағдайларда, мысалы операцияларды асыра жүктеу барысында, объектінің өзіне өзі сілтейтін көрсеткіш қолданылады. Ол this қызметші сөзімен анықталады.
§14 Көпфайлды программалар
Файларалық айнымалылар
Алдымен жариялаумен анықтаудың арасындағы айырмашылықты қарастырайық. Жариялау барысында жай анымалының типін және есімін көрсетеміз. Жариялау барысында бірден жадыдан орын бөлінбейді. Айнымалыны анықтау барысында ғана жадыдан орын бөлінеді. Яғни анықтау барысында ғана нақты айнымалы құрылады.
Бірақ көпшілік жариялаулар бір мезгілде анықтаулар да болып келеді. Тек жалғыз ғана extern сөзі қолданылған жариялау анықтау болып есептелмейді, яғни бұл сөзбен сипатталған жариялау үшін жадыдан орын бөлінбейді.
int sv; – жариялау және анықтау
extern int v; – тек қана жариялау.
Глобальді айнымалы программа бірнеше файлдардан тұрса да, бір ғана рет анықталынуы қажет. Программа А және В файлдарынан тұрсын.
Файл А
int globv; – А файлында анықтау
Файл В
int globv; – қате жариялау.
Егер келесі түрде жазсақ, олда қате болады:
Файл А
int globv; – А файлында анықтау
Файл В
globv=3; – қате, себебі В файлында А файлындағы анықтау көрінбейді.
Бұл қателерді extern сөзін қолдану арқылы жоя аламыз.
Файл А
int globv; – А файлында анықтау
Файл В
extern int globv; – extern сөзі бұл тек жариялау екендігін көрсетеді. Жадыдан
globv=3; орын бөлінбейді. А файлындағы globv айнымалысы В
файлында да көрінеді.
еxtern жариялауында бірден инициализациялауға болмайды.
Егер әртүрлі файлдарда бірдей есімді глобальді айнымалылырды қолдану керек болса, онда оларды static қызметші сөзінің көмегімен сипаттау керек. Ол кезде глобальді айнымалының көріну облысы файлдың көлемі болады, яғни сондай есіммен басқа айнымалыларды (жадыда бөлінген орындар) өзге файлдарда қолдана беруге болады.
Файл А
static int globv; – тек А файлында көрінеді
Файл В
static int globv; – тек В файлында көрінеді
const сөзінің көмегімен сипатталған айнымалы тек сол файлда ғана көрінетіндігін білеміз. Бірақ оны басқа файлдарда да көрінетін етуге болады. Ол үшін extern сөзін қолдану керек.
Файл А
еxtern const int с=99; (анықтау)
Файл В
еxtern const int с; – жариялау. В файлында А файлында анықталған с көрінеді.
Файларалық функциялар
Функцияны жариялау дегеніміз оның есімін, қайтаратын типін және аргументтерінің типтерін көрсету. Анықтау дегеніміз – ол жариялау және функияның коды. Сондықтан функцияларды бір файлда анықтап, басқа файлдарда жариялап, содан соң шақыра беруге болады.
Файл А
int add(int a, int b) – функцияны анықтау
{return a+b;}
Файл В
int add(int, int); – функцияны жариялау
………………..
int d=add(2,3); – функцияны шақыру
Бұл жағдайда extern сөзінің қажеті жоқ. Айнымалылар сияқты функцияны да басқа файлда көрсетпеуге болады.
Файл А
static int add(int a, int b) – функцияны анықтау
{return a+b;}
Файл В
static int add(int a, int b) – басқа функция
{return a+b;}
Файларалық кластар
Кластың жай айнымалыдан өзгешелігі, класты анықтау жадыдан орын бөлуді білдірмейді. Ол тек класқа нелер кіретіндігін, яғни құрамын көрсетеді. Сондықтан кез келген файлдан класты көру үшін әр файлда класты қайта анықтау керек.
Көптеген компиляторлар көпфайлды қосымшаларды басқарады, оларды проекттер деп атайды. Файлдарды біріктіру жөнінде ақпарат арнайы файлда сақталады. Ол проект файлы деп аталады. Microsoft ортасында проекттінің кеңеймесі .DSP болады. Проект файлы автоматты түрде жаңарып отырады. Негізгі және тақырыптық файлдар компиляцияланып, .OBJ және .LIB файлдары біріктіріліп орындалатын .EXE файлы құрылады.
Тақырыптық файлда класты қайталанып анықталуынан қорғау үшін файлды келесі препроцессор директивасынан бастау керек:
#if !defined (My_cl) – егер My_cl лексемасы анықталмаса
#define My_cl – оны анықтау
………… – класты анықтау
#endif – директиваның шартын жабу
Бұл әдісті тақырыптық файлды негізгі файлдарға бірнеше рет қосу керек болған жағдайларда қолдану қажет.
Көпфайлды проектіні құру алгоритмі:
1. Projects -> Win 32 Console Application
2. Проект есімін енгізу
3. File -> New -> Files
4. C/C++ Header File
5. Тақырыптық файл есімін енгізу
6. Тақырыптық файл мәтінін енгізу
7. File -> New ->Files
8. C++ Source ->File
9. Кеңеймесі .срр болатын класс әдістерімен негізгі программа сақталатын файл есімін енгіземіз
10. Build – компиляциялау және біріктіру
11. Execute – орындау.
Екі бағытталған тізім негізінде құрылған көпфайлды программа мысалы:
// m_cl_cl.cpp файлы
#include «m_cl.h»
void main()
{
pl d,d2,d3;
int xx;
for (int i=0;i {
cout< cout << strcat (sun, moon) << endl;
}
Бұл программа қандай нәтиже береді?
1) sunmoon 2) MOONSUN 3) sun+moon 4) moonsun 5) 5
109. Программа нені экранға шығарады?
int *c, *v, cl, c2, m;
с1=5; c2=4; с=& cl; v=& c2; m=*c**v/*с; сout< 1) Программа m айнымалысының мәнін есептеу барысында қате жіберілуі жөнінде хабарлама береді
2) 1 3) 2 4) 20 5) 5/4
110. Обьектілі бағытталған программалаудың негізгі принцптеріне не жатады:
1) Инкапсуляция, полиморфизм;
2) Инкапсуляция, полиморфизм, мұрагерлік;
3) Полиморфизм, мұрагерлік;
4) Инкапсуляция, мұрагерлік;
5) Класс, полиморфизм, мұрагерлік;
111. Келесі кластар және объектілер бар болсын.
class a {private: int i; void d(); protected: int z; void r(); public: int k; void l(); };
class b : public a {private: int y; public : void h();};
a obja; b objb;
Қате жіберілген жауапты анықтаңыз
1) objb.h();
2) int w=objb.k;
3) int s=obja.k;
4) int v=objb.i;
5) obja.l();
112. Туынды кластың public бөлігіндегі берілгендер
1) тек туынды кластың ішінде ғана көрінеді;
2) тек туынды кластың ішінде көрінеді және туынды кластың объектісі ғана көре алады;
3) базалық класc көре алады;
4) туынды кластың объектісі ғана көре алады;
5) базалық кластың объектісі ғана көре алады және туынды кластың ішінде ғана көрінеді.
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
1. Лофоре Р. Объектно-ориентированное программирование в С++. Классика Computer Science.4-издание. – Санкт-Петербург: «Питер», 2004 г.
2. Коплиен Дж. Программирование на С++. Классика Computer Science. – Санкт-Петербург: «Питер», 2005 г.
3. Вирт Н. Алгоритм + структура данных = программы. – М.: «Мир», 1985г.
4. Бурин Е.А. Введение в основы информатики и ВТ – Алматы, «Мектеп», 1989г.
5. Касьянов В.Н., Сабельфельд В.К. Сборник заданий по практикуму на ЭВМ.-М.:Наука, 1986.
6. Климова Л.М. Практическое программирование. Решение типовых задач. – М.:Кудиц-Образ, 2000.
7. Любимский Э.З., Мартынюк В.В., Трифонов Н.П. Программирование. – М.: Наука, 1980.
8. Анисимов А.В. Рекурсивные преобразователи информации. – Киев: «Вища школа», 1987г.
9. Сауханова Ж.С. Динамикалық құрылымды берілгендер және олардың қолданылуы.-Астана: Л.Н. Гумилев атындағы Еуразия ұлттық университеті, 2005ж.
1
2
3
4
5
Категория: Автоматтандыру | Добавил: Zufar
Просмотров: 735 | Загрузок: 0 | Комментарии: 2 | Рейтинг: 0.0/0
Всего комментариев: 2
Суббота
Автор: 11.05.2013
Сообщение #2.
Қазақша рефераттар
Қазақша рефераттар тегін,слайдтар, ҰБТ МАБ сұрақтары,шпорлар,анекдоттар - http://referatikz.ru
Суббота
Автор: 11.05.2013
Сообщение #1.
Қазақша презентациялар
Қазақша презентациялар - http://prezentaciya.ucoz.ru
Имя *:
Email:
Код *:
Поиск
Меню
Главная страница
Рефераты на казахском
Курсовые работы
Новости образования
Форум
Гостевая книга
Обратная связь
Категории раздела Автоматтандыру
Әлеуметтану, Саясаттану
Ән, Мәдениет, Өнер
Биология, Валеология, Зоология, Анатомия, Медицина
География, Экономикалық география, Геология, Геодезия
Журналистика
Информатика
Іс жүргізу
Кедендік іс
Қазақ әдебиеті
Қазақ әдебиет тұлғалары
Қазақстан тарихы
Қоршаған ортаны қорғау, Экология
Құқық, Қоғам, Криминалистика
Математика, Геометрия
Менеджмент, Маркетинг, Мемлекетті басқару
Психология, Педагогика
Спорт
Тіл ғылымы, Филология
Физика, Химия
Философия
Халықаралық қатынастар
Шығарма
Экономика, Қаржы, Бухгалтерлік іс, Банктік іс, Салық
Статистика
Онлайн всего: 0
Гостей: 0
Пользователей: 0
Самые скачиваемые рефераты
Достарыңызбен бөлісу: |