Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
88
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

19.3 Шаблоны классов

П р и м е р. Шаблон для универсального массива.

template <class T>

class UArr

{

T *v;

int size;

public:

UArr(int);

T& operator[](int i) {return v[i];}

};

Определение метода за пределами декларации класса требует особого синтаксиса заголовка.

template <class T> UArr<T>::Uarr (int n) {

v = new T[n];

size = n;

}

Инициализируют объект класса, указывая аргументы в угловых скобках.

UArr<int> x(20);

UArr<Myclass> y(30);

Вместо параметров-типов подставляют конкретные типы, вместо параметров-констант подставляют константные выражения.

Можно специализировать шаблон класса, предусмотрев для специфических типов явную реализацию отдельных методов.

UArr<char*>::UArr(int n) {...} .

Можно специализировать класс в целом. При этом специальное определение помещают после шаблона и определяют все методы класса.

Вопросы

1. Для чего предназначены шаблоны ?

2. Какие виды параметров бывают у шаблонов функций?

3. С какой целью определяют специализированные функции?

4. Чем отличается заголовок метода шаблона класса от заголовка метода класса, если метод определяется вне декларации класса ?

5. Чем отличается объявление объекта шаблонного класса от объявления объекта обычного класса ?

6. Предложите полезный, с вашей точки зрения, шаблон класса.

20 Директивы препроцесора

Директивы препроцессора начинаются с символа “#” и обрабатываются во время 1-й фазы компиляции. Промежуточный файл не генерируется, но можно использовать отдельный препроцессор CPP.EXE, чтобы получить такой файл.

20.1 Директива #define

С помощью директивы #define можно связать имя с некоторой лексемой или последовательностью лексем т.е. описать макрос (см. раздел 5.7). С помощью директивы #undef эту связь можно разорвать.

20.2 Директива #include

Эта директива предписывает компилятору поместить на ее место содержимое другого файла. Синтаксис директивы

#include <имя_файла>

или

#include "имя_файла".

Если имя_файла не является полным именем, в первом случае поиск происходит только в пределах специфицированных каталогов включаемых файлов. Во втором случае сначала просматривается текущий каталог.

20.3 Условная компиляция

Можно избирательно компилировать части файла. Синтаксис директивы условной компиляции следующий:

#if выражение_1

// эта часть файла компилируется, если выражение_1 истинно

#elif выражение_2

// эта часть файла компилируется, если выражение_1 ложно, а

// выражение_2 истинно

...

#else

// эта часть файла компилируется, когда все выражения ложны

#endif

Директивы #elif и #else могут быть опущены.

П р и м е р. Простое исключение секции кода

#if 0

// исключенная секция кода

#endif

Значения выражений в директивах #if и #elif должны быть целыми константами. В выражениях нельзя использовать операцию sizeof.

В качестве выражения в директивах #if и #elif можно использовать оператор defined . Он проверяет, был ли определен макрос.

П р и м е р. Выбор между секциями кода.

#if defined(NEARPOINTERS)

space = farcoreleft( );

#else

space = coreleft( );

#endif

Директивы #ifdef и #ifndef являются сокращением для директив #if defined и #if !defined соответственно.

П р и м е р. Предотвращение многократной трансляции заголовочного файла sample.h.

#ifndef __SAMPLE_H__

#define __SAMPLE_H__

// здесь содержание заголовочного файла sample.h

#endif

Если файл sample.h окажется многократно включенным в исходный код программы, то при таком “обрамлении” его содержимого будет оттранслировано лишь первое вхождение заголовочного файла.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]