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

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

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

. . .

x = ab( sin(z) + 1, 3 );

#include <iostream.h>

#define

f(a,b) ((a)+(b))

void fun(int a, int b) { cout<<" fun=" <<a + b; }

main()

{float d=1.11;

cout<<"\n” << f(2.3, 2) << fun(2.3, 2); // 4.3 fun=4 cout<<“\n” <<&d << f( &d, 2); // ffe2 ffea Контроль типа?!

fun( &d, 2 ); // Compiling DEFIN.CPP:

// Error DEFIN.CPP 16: Cannot convert 'float *' to 'int'

}

Описания Шаблонов-Фун

Список

template < class Type >

формальных

параметров

 

Шаблона

Ключевые слова Любой встроенный Тип

или Тип, определяемый

Польз-ем

template < class T1, class T2 >

Шаблоны Фун, пример

//вывод на экран значений массива

//заданного типа размером n

// Фун-шаблон:

T

template < class T >

void Out ( T *arr, int n)

{ for ( int i = 0; i < n; i++ )

cout << ” ” << arr[ i ];

}

int char float double

31

. . . . .

 

 

main()

 

 

{ char

str[10] = “string”;

float

x[20] = { 1.1, 2.2, 3.3, 4.4 };

Out( str, 6 );

// Шаблонные

Out( x, 4 );// Функции

}

В описании Шаблона Фун может быть список формальных параметров.

template < class T1, class T2, … >

T1 fun( T1 x, T2 y, . . . )

{ . . .

}

Возврат Д через вызов идёт по первому типу T1.

Каждый форм-й Парам из описания ШаблФун д.б. в списке Парам Фун !

Область действия Парам Шабл – свой Шабл.

Если Шаблон вызыв-ся с параметром - типом Польз-ля и если Шаблон исп-ет

Оп (+, ==, <= и др.) с Об этого типа, то такие Оп д.б. перегружены!

Для каждой Шаблонной Фун создаётся своя копия при вып-и П, что приводит к

затратам ресурсов Памяти.

Перегрузка Шаблонных Фун

родственные Фун, полученные из Шабл,

перегрузка Шаблона:

-другие Шабл с тем же Именем, но отличающиеся списком параметров,

-не Шабл-я Фун с тем же Именем, но с другим списком параметров.

32

Действия Комп-ра по выбору Фун

Поиск Фун, точно совпадающей

по имени, типу и списку пар-ов;

Поиск Шаблона;

Поиск перегруженной Фун

Повторяется поиск при неудачах

Шаблоны Классов

Возможность создания универсального ПО для использования с различными типами Д.

Пример, Класс Stack для Д различного типа

c Фун-Операциями : положить в стек, взять из стека,

Описанию Шаблона Класса предшест-т заголовок:

template < class Type >

Описания Фун-Элем Класса вне типа Класс – также с заголовком template

< class Type >

Пример Шаблона Класса QUEUE

template < class Type >

class QUEUE

{ public: QUEUE( int n_arr ); ~QUEUE( );

int qput( Type m ); Type qget( void );

рrivate: Type *q, int n, floc, lloc; void clear_q();

};

33

Пример реализации Фун-Элем ШаблКласса

template < class Type >

QUEUE< Type > :: QUEUE( int n_arr ) { floc = lloc = 0;

n = n_arr;

q = new Type [n]; clear_q( );

}

main()

{ QUEUE < int > intQue( 20 ); QUEUE < long > longQue( 30 );

intQue.qput( 5 );

}

Нетиповые параметры в ШаблКлассов template < class Type, int n_arr > class QUEUE

{ public: QUEUE( ); ~QUEUE( );

int qput( Type m ); Type qget( void );

рrivate: Type *q,

int n, floc, lloc; void clear_q();

};

main()

{ QUEUE < int, 15 > a;

а.qput( 5 );

34

const int n = 100;

QUEUE < long, n > *long_pq;

long_pq = new QUEUE < long, n >;

long_pq -> qput( 22 );

. . . . . }

Замечания о ШаблКлассов

Класс-Шаблон не м.б. Элем-м другого КлШабл;

Другие темы:

Шаблоны и наследование,

Шаблоны и «друзья»,

Шаблоны и статические Элементы Класса.

Статические Элементы Класса

Пример:

 

 

 

class STC

 

 

Обращение

{ public:

 

 

только к стат-м

STC( );

 

 

Элем

 

 

 

~ STC( );

 

 

Память не

static void count( );

выделяется

private:

 

 

 

 

 

static int c1,

// Всего создано Об

 

c2;

// Не удалены Об

};

 

 

 

STC::STC( )

{ c1++; c2++; }

STC::~STC( ) { c2 - -; }

void STC :: count( )

{cout << “ c1=” << c1 << “ c2=” << c2 << “\n”;} int STC::c1, STC::c2; // Описание c1, c2, Память! main( )

{STC::count( ); // До создания Об, с1=с2=0

STC A, B, *p;

35

A.count( );

// c1 = 2

c2 = 2

 

{ STC X, Y, Z;

 

 

 

STC::count( );

// c1 = 5 c2 = 5

} // При выходе из блока X, Y, Z – уничтож-ся:

B.count( );

// c1 = 5

c2 = 2

 

p = new STC; p->count( );

// c1 = 6

c2 = 3

delete p; STC::count( );

 

// c1 = 6

c2 = 2

};

 

 

 

 

Основные свойства:

 

 

 

Cтат-е Д Класса являются общими для всех Об данного Класса;

Фун-члены Класса также м.б. объявлены Стат-и. СтатФун не получают

Ук на свои Об (this), поэтому эти Фун не могут обращаться к нестат-м

членам Класса. К Стат-м Д могут обращаться только СтатФункции.

СтатФун - член класса не м.б. виртуальной;

К Стат-м Д и Функциям-членам Класса можно обращаться, если не создано ни одного Об - члена Класса.

***ПиОА_Л11 *** Компоновка П и Препроцессор (Препр)

Цель: научиться компоновать многоФайловую П, использ-ть директивы Препр

для разработки П, создавать и отлаживать П-ый Проект.

Компоновка П

Множ-во Классов

Разрабатывает

П коллектив Прогр-ов

Большой

ПрогПродукт

0

36

Соврем-й Язык П-я должен поддерж-ть произв-во больших П продуктов,

состоящих из многих десятков, сотен или даже тысяч Классов. П на языке Си++

может создаваться коллективом П-стов на протяжении нескольких лет.

Какие свойства д.б. у Языка П-я, позволяющие писать большие П ?

Компоновка нескольких Ф-ов в одну П

П

 

txt-Файл

Файл

*.cpp

*.ехе

Компилятор

 

Обработка исходных ФП – в 3 этапа

Текст П: *.срр-Файлы

Обр-ка Препр-м

Создание Компо-

Об_Файла новка

П

Обработка исходных ФП:

1. Обр-ка Препр-м: директивы #include, #define и др., П txt-Файл.

37

2. Создание Об_Файла. П переведена в машинные инструкции, но не совсем готова к выполнению. В Об_Файле имеются ссылки на системные Фун и на станд-е Фун языка Си++.

Пример, для Операции new нужен вызов системной Фун. Даже если в П явно не упомянута ни одна Фун, необходим один вызов системной Фун – завершение П и

освобождение всех принадлежащих ей ресурсов.

3. К Об_Файлу подсоединяются все Фун, на которые он ссылается. Фун тоже д.б. скомпилированы, т.е. переведены на машинный язык в форму Об_Файлов. Этот

процесс называется компоновкой, и его результат – ехе-Файл.

f1()

f2()

exe-Файл

Об_Файл

f3()

Сист-е Фун и станд-е Фун языка Си++ заранее откомпилированы и хранятся в виде библиотек. Библиотека – это архив Об_Модулей, с которым удобно

компоновать П.

Цель многоэтапной компиляции П – возможность компоновать П из многих

Файлов. Каждый Файл – это законч-й фрагмент П, который может ссылаться на

Фун, переменные или классы, опред-е в других Файлах. Компоновка объединяет фрагменты в одну П, которая содержит все необходимое для выполнения.

38

В языке Си++ – строгое правило: прежде чем

использовать в П Идент-р (имя), его нужно

определить!

Использовать

Создать Имя

Имя

Объявление Фун прототип, задает её формат:

int qput( int );

Определение Фун П ее выполнения.

Аналогично использ-е Классов. В языке Си++ Класс состоит из двух частей:

объявление и определение.

Вобъявлении Класса:

интерфейс Класса,

методы и атрибуты Класса.

template < class Type, int n_arr >

class QUEUE

{ public: QUEUE( ); ~QUEUE( );

int qput( Type m );

Type qget( void );

рrivate: Type *q, int n, floc, lloc; void clear_q();

};

Текст П на языке С++:

Файлы заголовков ( *.h ),

Файлы Программ ( *.cpp ).

Пример

определения Класса

Имеет смысл каждый Класс помещать в два Ф-а:

Файл заголовков для объявления Класса,

Файл Программ для определения Класса.

Имя Файла обычно состоит из имени Класса:

39

Name_Class.h, Name_Class.cpp

См. проект LR9_class, модуль List1

Включение Файлов м.б. вложенным,

т.е. Файл заголовков может сам использовать директиву #include

Файл QUEUE.h // Если

#ifndef QUEUEH

// Файл не определён,

#define QUEUEH

// то определить его

class QUEUE

 

 

{

 

 

...

 

 

}

 

 

#endif

// конец определения Файла

Файл queue.cpp

 

 

#include ”QUEUE.h”

// Подключить QUEUE.h

int QUEUE :: qget()

// Коды Фун класса QUEUE

{

. . . . . . . .

}

. . . . . . . .

В main() (в модулях проекта C++ Builder) подключить Файл QUEUE.h:

#include ” QUEUE.h”

Как правило П строятся по модульному принципу и состоят из множества Модулей. Принцип Мод-сти важен: Модуль можно модифицировать, не затрагивая остальные Мод и головную П. Именно в Модулях и выполняется Прогр-е задачи.

Принцип скрытия И – текст Мод разделяется на два файла:

Заголовочный файл (*.h) – интерфейс, Файл реализации с описанием Фун (*.cpp)

Препроцессор языка С++

Это П, выполн-я обработку Д для другой П.

Директивы Препр:

40