Лекции_Классы
.pdfФун-Д-р – Операции, сопровождающие удаление Об
Освобождение ДинПам,
Закрытие Файлов,
Вывод на экран сообщений и другое
QUEUE :: ~QUEUE ( )
{delete [ ] q;}
Свойства Фун-Д-ра
Д-р не м.б. перегружен;
Вызывается при выходе из Фун, в кот. объявлен Об;
Можно вызвать явно:
Ob.~QUEUE( );
Фун-Д-р НЕ имеет параметров;
К-р и Д-р не возвращают значения
Пример создания Об в ДинПам
. . . . . |
|
|
QUEUE *pq; |
// Ук на Объект класса … |
|
cin >> n; |
// размер массива-Очереди |
|
pq = new QUEUE( n ); |
// Вызов К-ра ! |
if( !pq ) { cout << “ Нет Памяти! ” } pq -> qput( 7 );
. . . . .
delete pq;
. . . . .
11
Н а с л е д о в а н и е
|
ios |
|
cin |
cout |
|
cerr |
||
istream |
||
ostream clog |
ifstream iostream ofstream
Объекты
fstream класса
Часть иерархии Классов потоков вв/выв С++
Наследование – фундам-я концепция
ООП
Цель наследования - расширение свойств и методов существующих классов.
public
class derived: protected base private
Имя производ- |
|
|
|
Имя базового |
|
Режим |
|
||
ого класса |
|
|
класса |
|
|
|
доступа |
|
|
{ < свойства и методы,
класса derived >
}
При наследовании:
-добавление свойств и (или) методов,
-замена или модификация БазКласса.
|
Наследование |
|
|
|
|
|
|
|
|
|
|
X |
|
Z |
|
||||||
|
|
|
|
|
|
|
|
|||
|
простое |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
множественное |
|
|
|
|
|
Z |
|
|||
|
|
|
|
|
|
|||||
|
|
|
Y |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. . . . . |
|
|
|
12
Пример наследования, Класс QUEUE
В производный класс добавим номер очереди ( id ), Фун get_num(num), дающую информацию: «находится ли клиент num в очереди и под каким номером?» и Фун get_id(), возвращ-ю id.
// Синтаксис произв-го класса class Que1 : public QUEUE
{ public:
Que1(int n_arr, int ident); // К-р
int |
get_num( int num ); |
int |
get_id( ); // Возвращает id |
private: |
|
int |
id; |
}; |
|
Формальные
параметры
// Конструктор
Que1 :: Que1( int n_arr, int ident ) :
QUEUE( n_arr )
{ id = ident; }
Фактический
параметр
int Que1::get_num( int num ) { for( int i = floc; i < lloc; i++ )
if( num == q[ i ] ) return (i – floc ); return -1;
}
int Que1::get_id( ) { return id; }
13
Замечание:
Когда К-р БазКласса не имеет параметров, то К-р в производном классе
может отсутствовать, если не нужно инициализировать его дополнительные
параметры.
Режимы доступа к элементам БазКласса
из Произв-го Класса
public
class derived: protected base private
Имя производ- |
|
|
|
|
|
|
|
Имя базового |
|
|
Режим |
|
||
ого класса |
|
|
класса |
|
|
доступа |
|
||
|
|
|
|
{ < свойства и методы,
класса derived >
}
Ааааа
Ббббб
Сссссс
…..
• public
•protected
•private
ввввв
кккккк
ттттт
…..
Базовый класс
Производный
класс
14
Режимы доступа к элементам БазКласса
из Произв-го Класса
режимы наследования разделов: PUBLIC PROTECTED PRIVATE
|
public |
protected |
private |
public |
|
protected |
protected |
private |
protected |
|
не дост |
не дост не доступен |
private |
|
|
|
|
|
|
в производном классе
доступ к Эл-м Base-класса
Закрытые элементы в БазКлассе доступны через открытые или защищённые функции-элементы БазКласса.
Множественное наследование
class Z : public X, protected Y
{ |
|
|
|
X |
|
|
|
< Д и Фун Класса Z > |
|
|
Z |
|
|||
} |
Y |
|
|
|
|
// К-р Класса Z
Z :: Z( int i, int k, int m ): X( i ), Y( k )
{m = . . . ; // инициализация
< Операторы К-ра Z >
}
Присваивание Объектов Класса
. . . . .
QUEUE q1, q2;
< Определение Об q1 >
q2 = q1;
. . . . .
15
Замечание:
Если в Классе для Д – ДинПам, то Операцию = нужно перегружать !
Замечания по классам
• Использовать способы доступа по одному разу:
public: protected: private:
открытый интерфейс услуг Класса;
•Если реализация Класса изм-ся, но интерфейс
не меняется, то коды П с этим Классом не нужно модиф-ть;
•Д-элем Класса нельзя инициал-ть при объяв-и: class QUEUE
{ . . . private: n = 25; . . .}
Порядок вызовов К-в и Д-в при наследовании
Класс X Класс Y Класс Z
Вызов К-в:
Вызов Д-в:
Если в классе объявлены Объекты классов, то порядок выполнения К-ов: К-ры базовых классов сверху, К-ры Об в порядке их записи в классе, К-р производного класса
16
Отделение интерфейса от реализации
– это фундам-й принцип разработки ПО
Файл queue.h
#ifndef QUEUE_H #define QUEUE_H class QUEUE
{ |
Способ реализации |
|
... |
Принципа Наименьших |
|
Привилегий |
||
} |
||
|
||
#endif |
// конец определения файла 1 |
Отделение интерфейса от реализации Файл queue.cpp
#include ”queue.h” // Подключить Файл queue.h int QUEUE :: qget() // Коды Фун класса QUEUE
{
. . . . . . .
}
. . . . . . .
*** ПиОА_Л9 ***
Классы 3. Перегрузка Функций и Операций
Цель: понять перегрузку Функций, перегрузку Операций, дружественные Фун и Классы.
Перегрузка Функций
позволяет использовать одно Имя для нескольких Фун с разным списком параметров – кол-во параметров и/или их типы:
1)int add( int x, int y ) { return x+y; }
2)int add( int x, int y, int z ) { return x+y+z; }
17
3) double add( double x, int y ) { return x+y; }
Перегруж-е Фун не могут отличаться только типом возвращаемого значения !?!
Примеры: |
|
int m, k = 10; |
double z; |
m = add( 3, k ); |
// m = 13 – целое |
m = add( 1, m, 2 ); |
// m = 16 – целое |
z = add( 1.11, k ); |
// z = 11.11 – веществ-е |
Пример: перегрузка Констр-в в class QUEUE
{ public:
QUEUE( int n_arr ); // К-р с параметром
QUEUE( ); |
// К-р по умолчанию |
~QUEUE( ); |
// Д-р |
. . . . . |
|
};
// К-р по умолчанию
QUEUE :: QUEUE( ) { floc = lloc = 0;
n = 50;
q = new int [n]; clear_q( );
}
Значения парам-в Фун по умолчанию
int add( int x = 1, int y = 2, int z = 3 )
{ return x + y + z; } |
|
|
main() |
|
|
{ |
int k; |
|
|
k = add( ); |
// k=6 |
|
k = add( 10 ); |
// k=15 |
|
k = add( 10, 20 ); |
// k=33 |
|
k = add( 10, 20, 30 ); |
// k=60 |
18
k = add( 10, , 30 ); // Нельзя пропуск параметра!
}
Пример: К-р с параметрами по умолчанию
class QUEUE
{public:
//К-р с параметром по умолчанию
QUEUE( int n_arr = 50 );
~QUEUE( ); |
// Д-р |
. . . . .
};
Пример: Объявление Об Класса, в котором К-р с парам-ми по умолчанию
main( )
{ QUEUE q, // К-р с парам. по умолчанию
qq( 100 ); // К-р с парам-ом
. . . . .
};
Альтернатива перегрузке Фун ?!?
Перегрузка Операций
В С++ возможность работать с Об Классов на уровне Операций.
Пример: Поставить Клиента в Очередь можно двумя способами.
•Вызов Фун_Эл: qOb.qput( Num );
•Перегрузка Оп «+» для постановки Клиента в Оч: qOb + Num;
!!!Использовать перегрузку Операций, если есть смысл:
•операции часто используются,
•соответствуют семантике выполняемых действий.
Пример: Операции с векторами и матрицами, N-мерными массивами.
С = A + B; // С, A, B - Объекты
Неявный параметр this – Ук на Об
При вызове Фун-члена Класса передаётся Ук на Об, содержащий эту Фун-
элемент.
19
Пример: |
|
|
сlass X |
|
|
{ int i; |
// по умолчанию доступ private |
|
public: |
|
|
void put( int k ) |
|
|
{ |
i = k; } // или: |
this -> i = k; |
… |
|
|
}; |
|
|
// Вызов: Ob.put ( 7 );
Пример из учеб. Березин и Березин «Нач. курс С и С++»
сlass Vector |
|
{ public: |
|
Vector( int xx, int yy, int zz); // К-р |
|
Vector operator |
+ ( Vector t ); |
Vector operator |
= ( Vector t ); |
Vector operator |
+= ( Vector t ); |
Vector operator ++ ( void ); |
// ++Ob |
|
Vector operator ++ ( int ); |
// Ob++ |
|
private: |
int x, y, z; |
|
}; |
|
|
Реализация Фун перегрузки Оп +
Vector Vector::operator +( Vector t )
{Vector tmp; tmp.x = x + t.x; tmp.y = y + t.y;
tmp.z = z + t.z;
return tmp;
} |
// А + В; |
20