- •Қазақстан республикасы білім және ғылым министрлігі қ. Жұбанов атындағы ақтөбе мемлекеттік университеті
- •050602 - «Информатика» мамандығы күндізгі бөлімінің
- •«Obp 4301 Объектіге бағытталған программалау» пәнінен
- •II кафедраның әдістемелік секциясы отырысында талқыланды
- •Пән мазмұны
- •Лабораториялық сабақтардың тақырыптарының үлгілі тізімі
- •Өзіндік жұмыстардың тақырыптарының үлгілі тізімі
- •Ұсынылған әдебиеттер тізімі
- •Оқу пәнінің жұмыс бағдарламасы
- •I жұмыс бағдарламасы дайындалып енгізілді
- •II кафедра отырысында талқыланды
- •IV факультеттің оқу-әдістемелік комиссиясына бекітуге ұсынылды
- •V алғашқы тексеру мерзімі 2011 ж. Тексеру мерзімділігі 1 жыл
- •Дәрістер
- •Практика сабақтары
- •Лаборатория сабақтары
- •Негізгі әдебиеттер
- •Оқу пәнінің жұмыс бағдарламасы
- •Пәннің тақырыптық жоспары
- •Өзіндік жұмыс тапсырмалары
- •1. Жұмыс түрлері:
- •2. Жұмыс түрлерін бағалау критериилері:
- •Курстық жұмыстың тақырыптары
- •Пән бойынша тапсырмаларды орындау және тапсыру графигі
- •Пәннің оқу-әдістемемен қамтамасыз ету картасы
- •Қр білім және ғылым министрлігі
- •2. Көпше түрдегі мұрагерлік
- •2. Операторларды қайта анықтаудың түрлері.
- •3. Унарлы операторларды қайта анықтау
- •4. Бинарлы операторларды қайта анықтау
- •5. Меншіктеу операторларын қайта анықтау
- •6. New және delete операторларын қайта анықтау
- •Жәй және күрделі полиморфизм
- •Виртуальді функциялар
- •Иерархия схемасы
- •Қр білім және ғылым министрлігі
- •2. Орындауға арналған тапсырмалар:
- •Практикалық жұмыс №2 конструкторларды және деструкторларды құру
- •2. Орындауға арналған тапсырмалар:
- •3. Өз бетімен орындауға арналған тапсырмалар (үй тапсырмасы):
- •Практикалық жұмыс №3-4 мұрагерлік. Жалғызданған және көпше түрдегі мұрагерлік
- •2. Орындауға арналған тапсырмалар:
- •3. Өз бетімен орындауға арналған тапсырмалар (үй тапсырмасы):
- •Практикалық жұмыс №5-6 полиморфизм. Амалдарды қайта анықтау
- •3. Өз бетімен орындауға арналған тапсырмалар (үй тапсырмасы):
- •5. Литерлік шамаларға қолданылатын функциялар қай кітапханада орналасқан?
- •Практикалық жұмыс №7-8 функциялардың және операторларды қайта жүктеудің бірге қолданылуы
- •3. Өз бетімен орындауға арналған тапсырмалар (үй тапсырмасы):
- •Практикалық жұмыс №9-10 енгізу-шығару ағындары
- •2. Өз бетімен орындауға арналған тапсырмалар (үй тапсырмасы):
- •Қр білім және ғылым министрлігі
- •Жұмысты орындау тәртібі
- •Өзіндік жұмыс тапсырмалары
- •Жұмыс есебі
- •Жұмысты орындау тіртібі
- •Өзіндік жұмыс тапсырмалары
- •Жұмыс есебі
- •Жұмысты орындау тіртібі
- •Өзіндік жұмыс тапсырмалары
- •Жұмыс есебі
- •Лабораторялық жұмыс бойынша сұрақтар
- •Лабораториялық жұмыс № 6-7 объектілер иерархиясы. Топтар. Итераторлар.
- •Қысқаша теориялық мәліметтер
- •Объектілер иерархиясы.
- •Мұндағы gr топ-объект.
- •Жұмысты орындау тәртібі
- •Өзіндік жұмыс тапсырмалары
- •Жұмыс есебі
- •2.Достық функциялар
- •Іі. Жұмыстың орындалу реті
- •Ііі. Өзіндік жұмыс тапсырмалар
- •Жұмыс есебі
- •Іі. Жұмыстың орындалу реті
- •Бүтін сандармен жұмыс жасайтын объект-калькулятор.
- •Жұмысты орындау реті.
- •Әдістемелік нұсқау.
- •Есеп берудің мазмұны.
- •Калькулятор
- •Қр білім және ғылым министрлігі
- •3. Практикалық және лабораториялық сабақтарды орындау
- •Қр білім және ғылым министрлігі
- •Тақырыбы: Конструкторлар және деструкторлар
- •Тақырыбы: Мұрагерлік
- •Тақырыбы: Операторларды қайта жүктеу
- •Тақырыбы: Ағындық кластар
- •Бақылау-өлшеу материалдары
- •21. Литерлік шамаларға қолданылатын функциялар қай кітапханада орналасқан?
- •Келісу парағы
Жұмыс есебі
- Жұмыс тақырыбы мен мақсаты;
- Жұмыстың орындалуы кезінде қойылған сұрақтарға жауап беру;
- Өзіндік жұмыс программасының листингі.
Лабораторялық жұмыс бойынша сұрақтар
Класта не үшін конструктор анықталады? Класта неше конструктор болуы мүмкін? Конструктор қашан шақырылады?
Конструктор private ену облысынд сипатталуы мүмкін бе?
Класта не үшін деструктор анықталады? Класта неше деструктор болуы мүмкін? Деструктор қашан шақырылады?
Деструктор private ену облысынд сипатталуы мүмкін бе?
Үнсіз жағдайдағы конструктор, деструктор дегеніміз не? Олар қай уақытта шақырылады?
ЛАБОРАТОРИЯЛЫҚ ЖҰМЫС № 4-5
МҰРАГЕРЛІК ЖӘНЕ ВИРТУАЛЬДІ ФУНКЦИЯЛАР
Жұмыстың мақсаты: Туынды кластар класс қасиеттерін мұрагерленіп алу мүмкіндігімен таныстыру.
Қысқаша теориялық мәліметтер
Жалғызданған және көпше түрдегі мұрагерлік
1.1. Жалғызданған мұрагерлік
Жалғызданған мұрагерлік екі калсс арасындағы туыстықты сипаттайды: олардың біреуі екіншісін мұрагерленеді. Иерархияның шыңында орналасқан класс базалық деп аталады. Басқаларын туынды кластар деп атайды. Бір кластан көптеген кластар туындауы мүмкін, бірақ байланыс түрі жәй тұқымқуалау болып қала береді. Базалық класты атаналық, ал туынды класты – мұрагерлік деп атайды
Туынды класс базалық кластан конструкторлар мен деструкторлардан басқа, тек мүше-мәліметтерді және мүше-функцияларды мұрагерленеді.
class Tbase { //Базалық класс
private:
int count;
public:
TBase() {count = 0;}
void SetCount(int n) {count = n;}
int GetCount(void) {return count;}
};
class TDerived: public TBase { //Туынды класс
public:
TDerived(): Tbase() {}
void ChangeCount(int n) {SetCount(GetCount() + n);}
};
Туынды класс TDerived деп аталады. Атынан кейін қос нүкте және келесі кілттік сөздердің біреуі – public, protected, private болады. Бұлардан кейін базалық класс аты TBase болады. Ашық кластың ашық мүшелері туынды класта да ашық болады:
class TDerived: public TBase {}
Tbase-тың барлық жабық мүшелеріTderived-те жабық болады, оларға ену мүмкіндігі болмайды. Базалық класты жабық түрде сипаттауға болады:
class TDerived: private TBase {}
Базалық кластағы ашық мүшелер TDerived-те жабық болады. TDerived-ты мұрагерленетін кластар TBase мүшелеріне ене алмайды. Туынды класта конструктор болады, егер ол базалықта болса. Ол базалық класс коснтрукторын шақыруы тиіс:
TDerived(): TBase() {}
Бұдан басқа да әрекеттер орындалуы мүмкін, мысалы:
TDerived():TBase() {cout <<" I am being initialized" <<endl;}
Хабарланған конструкторды дербес жүзеге асыруға болады:
TDerived::TDerived()
: TBase()
{ // операторлар
}
Туынды класс базалық кластан count-ты мұрагерленеді, бірақ ол TBase-те жабық болғандықтан оған ену тек TBase класының функция-мүшелері арқылы ғана мүмкін болады. Туынды класта TBase класының мұрагерлік функция-мүшелеріне енетін функцияны анықтауға болады:
void ChangeCount(int n) {SetCount(GetCount() +n);}
Кластың қорғалған мүшелері – ол ашық және жабық мүшелері арасындағы мүшелер. Жабық мүшелер сияқты олар тек функция-мүшелерге ғана көрінеді. Кластан тыс олар қолданылмайды. Ашық мүшелер секілді олар туынды класс функция-мүшелеріне ғана көрінеді.
- жабық мүшелер хабарланған класта ғана көрінеді;
- қорғалған мүшелер өзіндік класс мүшелеріне және туынды класс мүшелеріне көрінеді;
- ашық мүшелер өзіндік класстың да, туынды кластың да, осы класты пайдаланатын қалған мүшелерге де көрінеді.
Спецификаторлар (public, private, protected) мұрагерленетін мүше статусына әсер етеді:
- ашық базалық класс мүшелері туынды класта ену мүмкінідігінің специфкацияларын сақтайды;
- қорғалған базалық кластың ашық мүшелері туынды класта жабық болады.
Қорғалған және жабық мүшелер өзідерінің бастапқы спецификацияларын сақтайды;
- жабық базалық кластың барлық мүшелері бастпақы ену спецификациясынан тәуелсіз туынды класта жабық болады.
Егер туынды класта мұрагерленетін мүшелердің кейбіреуін ғана ашық етіп қалдырғыңыз келсе, олардың біреуін немесе бірнешеуін квалификациялауға болады.
class A {
public:
int x;
A() { x=0;}
void Display(void) { count << "x = " << x << endl;}
};
class B: private A {
public:
A::Display; // кластың ашық мүшесі ретінде квалификациялаймыз
B(): A() {}
};
Туынды класта деструктор бір нәрсені жою керек болғанда ғана қажет болады.
// Программа 1
#include <iostream.h>
#include <string.h>
class TBase { //Базалық класс
private:
char *basep;
public:
TBase(const char *s) {basep = strdup(s); }
~TBase() {delete basep;}
const char *GetStr(void) { return basep; }
};
class TDerived: public TBase { //Туынды класс
private:
char *uppercasep;
public:
TDerived(const char* s): TBase(s) { uppercasep = strupr(strdup(s));}
~TDerived() {delete uppercasep;}
const char *GetUStr(void) { return uppercasep;}
};
void main()
{
TBase president("George Washington");
cout << "Original string: " << president.GetStr() << endl;
TDerived pres("George Washington");
cout << "Uppercase string:" << pres.GetUStr() << endl;
}
Туынды класта әдетте жаңа мәліметтер мен функция-мүшелер қосады. Бірақ базалық кластан мұрагерленген функция-мүшелерін алмастыру мүмкіндігі бар. Мысалы:
//Программа 2
#include <iostream.h>
#include <string.h>
class TBase { //Базалық класс
private:
char *basep;
public:
TBase(const char *s) {basep = strdup(s); }
~TBase() {delete basep;}
void Display(void) { cout << basep << endl;}
};
class TState: public TBase { //Туынды класс
public:
TState(const char *s):TBase (s) {}
void Display(void); // ауыстыратын функция
};
void TState::Display(void)
{
cout << "State: "; //НЖаңаоператор
TBase::Display(); //Ауыстырылған функцияны шақыру
}
void main()
{
TState object("Welcome to Borland C++5 programming!");
object.Display();
}
1.2. Көпше түрдегі мұрагерлік
class A { /*…*/ };
class B { /*…*/ };
class C: public A, private B { /*…*/ };
С::С( int a, char* str) : A(a), B(str) { /*…*/ };
2. Виртуальді функциялар
Виртуальді функция – бұл объект типінен тәуелді шақырылатын функция ОБП-да программа орындалған уақытта объект қандай функцияны шақыру керектігін анықтайтындай виртуальді функцияларды жазуға болады. Виртуальді функцияларды қолдану механизмін кейде полиморфизм деп атайды, өйткені виртуальді функцияларды қолданатын объектілер қолданылып отырған контекстке икемделетін болғандықтан
Виртуальді функциялар түсінігін дұрыс түсіну үшін тұқымқуалау қатынасымен байланысты С++ класының маңызды принципімен танысыңыз. С++ ережелеріне сәйкес базалық класқа көрсеткіш осы класс объектісіне немесе базалық кластан туындаған кез келген туынды класс объектісіне сілтей алады.
Мысал: 3 класс берілген: В класы А класынан туындаған, ал С класы В класынна туындаған.
A aObject; //Класс объектілерін хабарлау
B bОbject;
C cОbject;
Тұқымқуалаумен байланысты болғандықтан А класына көрсеткіш осы объектілердің кез келгеніне сілтеуі мүмкін. Бұл байланыс бір бағытта ғана жұмыс жасайды.
A *p;
p = &cОbject;
Бұл принцип туыстық қатынастағы кластарда виртуальді функциялар анықталған жағдайда маңызды болады.
Бұл функциялар дәл сондай түрде болады және кәдімгі функциялар сияқты программаланады, тек virtual қызметші сөзі қосылады.
class A
{ public:
virtual void vf();
};
Виртуальді функция параметрлермен хабарлануы мүмкін, басқа кез келген функция тәрізді мән қайтаруы мүмкін.
class B: public A {
public:
virtual void vf();
};
Класта ата-аналық класстың виртуальді функциясының атымен бірдей атты виртуальді функция хабарланған жағдайда, ондай функция ауыстырғыш функция деп аталады. *р көрсеткіші С типті объектіге сілтейді, сондықтан
р->vf(); // С класының виртуальді функциясын көрсетеді.
// Программа 3 //Виртуальді функция мысалы
#include <iostream.h>
class TValue {
public:
virtual double func(double x) { return x*x; }
double culc(double x) { return func(x)/2; }
};
class DValue: public TValue {
public:
virtual double func(double x) { return x*x*x; }
};
void main()
{
TValue obj1;
cout << obj1.culc(3) << endl;
DValue obj2;
cout << obj2.culc(3) << endl;
}
Таза виртуальді функция – бұл туынды класпен толтыруды күтіп тұрған бос орын. Кәдімгі виртуальді функция сияқты хабарланады, тек соңында = 0-мен аяқталады.
Мысал:
class Abstract {
public:
virtual void f1(void) ; //кәдімгі виртуальді
virtual void f2(void) = 0 ; //таза виртуальді
};
Компиляторға класстағы басқа функцияларға қарағанда f2 функция-мүшесінің жүзеге асырылуы қажет емес.
Егер класта ең болмағанда бір таза виртуальді функция-мүшесі болса, ол абстрактілі класс деп аталады. Абстрактілі класс бұл негізінде туынды класс құруға болатын схема. Абстрактілі класты қолдану үшін одан жаңа класс шығару керек:
class MyClass: public Abstract {
public:
virtual void f2(void); //көне таза виртуальді функция
};