Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции_Классы

.pdf
Скачиваний:
10
Добавлен:
02.06.2015
Размер:
616.21 Кб
Скачать

Фун-Д-р Операции, сопровождающие удаление Об

Освобождение ДинПам,

Закрытие Файлов,

Вывод на экран сообщений и другое

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