
- •Аргументы функций по умолчанию.
- •Арифметические операции с указателями и с указателями на массивы.
- •5. Виртуалдық базалық класстар.(2,5) Жиындық мұра лық ету. (I 10)
- •Модификатор volatile
- •Модификатор const
- •Модификатор volatile
- •8 Виртуалдық функциялар. (2,9) Біріктірулер: синтаксисі жəне ережелері. (2,3)
1.Абстракталық класс бұл экземпляры құрылмйтын класс.Ең кең тарағаны геометриялық фигура.Осы фигура арқылы белгілі формалао пайда болады. Бұларлың экземплярын құруға болады.Абстрактный болу үшін міндетті түрде виртуалдық функция болуы керек.Төменде мысал келтірілген
-
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
class Shape
{
public:
virtual double area() const = 0;
};
class Square: public Shape
{
public:
Square(double a = 1): _a(a) { }
virtual double area() const { return _a * _a; }
private:
double _a;
};
class Circle: public Shape
{
public:
Circle(double r = 1): _r(r) { }
virtual double area() const { return 3.14159265358 * _r * _r; }
private:
double _r;
};
int main()
{
Shape *shapes[5];
shapes[0] = new Circle (3);
shapes[1] = new Square (2);
shapes[2] = new Square (2.5);
shapes[3] = new Circle (5);
shapes[4] = new Circle (10);
for (int i = 0; i < 5; ++i)
std::cout << shapes[i]->area() << std::endl;
for (int i = 0; i < 5; ++i)
delete shapes[i];
return 0;
}
Байқағанымыздай Shape абстрактный себебі бұл жерде виртуалдық функция area бар. Класстардағы Shape - Circle и Square де area анықтамасы бар. Басты функциядағы Shape де массив құрылған.Кейн оз фигурасын анықтайды.Цикл ішінде қандай ұяшықта қандай массив орналасканын білгеннен кейін әрқайсысына area шақырамыз,ол әр обьектіге оз қадамын жасайды.
Конструкторлар объектіні инициализа- циялау үшін арналған және автоматты түрде шақырылады. Конструктордың негізгі қасиеттері:
конструктор мән қайтармайды, void типі болса да;
класстың бірнеше конструкторлары болуы мүмкін, бірақ олар әр түрлі параметрлі;
параметрсіз шақырылған конструктор үндеместік конструкторы (конструктор по умолчанию) деп аталады;
параметрлі конструктор инициализация конструкторы деп аталады;
егер программист бірде–бір конструкторды көрсетпесе, онда компилятор оны өзі құрады;
ауқымды объектілердің конструкторлары main функциясы шақырылғанға дейін берілуі керек;
конструктор мұрагерлікке қалдырылмайды.
Көшіру конструкторы- бұл класстың объектісіне нұсқауыштың жалғыз параметрі ретінде алынатын конструктордың арнайы түрі.
Берілу форматы:
T::T(const T&) {конструктор денесі},
мұндағы Т-конструктор аты.
Жаңа объект бар объектіні көшіру арқылы алынатын болса, онда көшіру конструкторы шақырылады.
Деструктор – бұл берілген класстың нақты объектілерімен байланысқан ресурстарды босату үшін қолданылатын арнайы функция-мүшелер. Дестукторлар класс объектілерін автоматты түрде бұзады (разрушение). Форматы:
class className
{ public:
className(); // үнсіздік бойынша конструктор
// басқа конструкторлар
~className(); // деструкторды хабарлау
// басқа функция-мүшелер
};
Деструкторлар қасиеттері
Деструктор – объектіні жою кезінде шақырылатын әдіс
Аты класс атымен сәйкес келеді, ~ белгісінен басталады
Параметрлері жоқ
class Complex
{
…
public:
~Complex()
{
}
}
Деструкторда файлдарды жабуға және жадыны босатуға болады.
Мысалы
Қосымша
new операторы конструкторды, ал delete – деструкторды шақырады
Динамикалық жадыны қолдану, яғни жады компиляция кезінде емес, программаны қосу кезінде анықталады.
Жадыны бөлу
new опрератоы барлық мәліметтер типтері үшін жұмыс істейді
Аргументы функций по умолчанию.
Класс c o m p l e x включает три конструктора, два из которых просто подставляют нулевое значение (по умолчанию ), предоставлены программисту для удобства нотации. Использование перегрузки типично для конструкторов, но также часто обнаруживается и для других функций. Такая перегрузка, однако, весьма трудоемкий обходной путь подстановки аргументов по умолчанию и, в особенности для более сложных конструкторов, крайне избыточнa. Следовательно должна быть предоставлена возможность для непосредственного задания аргументов по умолчанию. Например:
class complex { . . . public: complex(double r=0, double i=0) { re = r; im = i;} };
Если завершающий аргумент отсутствует, может быть использовано константное выражение по умолчанию. Например :
complex a(1,2); complex b(1); /* b = complex(1, 0); */ complex c; /* c = complex(0, 0); */
Если составляющая функция такая, как вышеприведенная функция c o m p l e x не только описана, но и определена, (то есть приведено ее тело) в описании класса, то при обращении к ней может быть выполнена константная подстановка, избегая тем самым обычных накладных расходов по вызову функции. Константная подстановка функции не является макроподстановкой, семантика такой функции идентична семантике других функций. Любая функция может быть объявлена включаемой (*1) предшествующим указанием ключевого слова i n l i n e . Включаемые функции могут сделать описания классов крайне раздутым и они в случае разумного использованияа повышают эффективность исполнения, но всегда увеличивают время и память, необходимые для компиляции. Включаемые функции, таким образом, должны использоваться только в случае, если ожидается значительное повышение эффективности исполнения. Они были включены в С++ вследствие опыта использования макросов в С. В некоторых приложениях макросы бывают необходимы (и нет возможности определить макрос в составе класса) но значительно чаще они создают хаос тем, что выглядят как функции, но не подчиняются ни синтаксису функций, ни правилам видимости, ни правилам передачи аргументов.
Конструкторда әр объект құрылғанда С++ автоматты түрде шақыратын арнайы функция бар. Конструктордың аты класстың атындай. Мысалы, file деген классты конструктор да file деген атпен қолданылады. Конструкторды кез келген класстың әдісі секілді ішкі программады солай анықтайды. Тек бір ғана айырмашылығы конструкторда қайтарылатын мән (возвращаемого значения) жоқ. Конструктордың параметрлерін кейін объектіні жариялығында беруге болады.Төмендегідей:
class_name object(valuel, value2, value3)
Сонымен, конструктор объектіні жариялауға қолданады. Конструктор жаңа объектінің қалай құрылғанын, жадыны бөлу және объектіні инициализациялауды анықтайды. Оның анықтауына жадыны бөлудің инструкциясы, элементтерге мәндерде меншіктеу, т.б. осы классқа қатыстының барлығы жатады. Конструкторлар өз класстарының атын мұрагерлікке қалдыра алады:
class sber_bank { < Классты жариялау
private:
double big_bucks;
public:
sber_bank(double bucks); < Конструктор
void deposit(double bucks);
double withdraw(double bucks);
};
Конструкторды сипаттаудың ретін талдайық:
Селектор Қолданылып тұрған класс Конструктордың аты
sber_bank :: sber_bank(double bucks)
{
big_bucks = bucks; < Инициализация данных
}
Конструктор можно сделать встроенным:
class sber_bank {
private:
double big_bucks;
public:
// Встроенный конструктор
sber_bank(double bucks) { big_bucks = bucks; }
void deposit(double bucks);
double withdraw(double bucks);
};
Конструкторды шақыру Конструкторды шақыру айқын емес, оны объектіні жариялау кезінде объектінің функциясы арқылы шақырамыз.
Имя Объект класса
sber_bank counterfeit_bank_of_AZ(1000000.00);
void doit(void)
{
sber_bank telly(1000.0); < Мұнда конструктор шақырылады
...
Конструктордар саны шексіз. Сонымен қатар көшіру конструкторлары да бар. Компилятор қай конструкторды шақырып тұрғаны жайды өзі біледі.