
Лекции_Классы
.pdf
. . .
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