Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
54
Добавлен:
15.06.2014
Размер:
478.21 Кб
Скачать

Вопрос 3. Шаблоны функций.

Перегруженные ф-ции обычно используются для выполнения сходных операций над различными типами данных. Если операции идентичны для каждого типа, это можно выполнить более компактно и удобно, используя шаблоны ф-ций. Пишется единственное определение шаблона ф-ции. Основываясь на типах аргументов, указанных в вызовах этой функции, С++ автоматически генерирует разные функции для соответствующей обработки каждого типа. Таким образом, определение единственного шаблона определяет целое семей­ство решений.

Все определения шаблона ф-ции начинаются с ключевого слова template, за к-ым следует список формальных типов параметров ф-ции, заключенный в угловые скобки (< и >). Каждый формальный тип параметра предваряется ключевым словом class. Формальные типы параметров — это встроенные типы или типы, определяемые пользователем. Они используются для задания типов аргументов ф-ции, для задания типов возвращаемого значения ф-ции и для объявления переменных внутри тела описания ф-ции. После шаблона следует обычное описание ф-ции. Синтаксис шаблона должен повторяться как при объявлении, так и при определении функции. Можно определить неск-ко типов-шаблонов данных в инструкции template:

template <class T>

Т maximum(T valuel, Т value2, Т value3)

{ Т max = valuel;

if (value2 > max) max = value2;

if (value3 > max} max = value3;

return max; }

Этот шаблон ф-ции объявляет единственный формальный параметр Т как тип данных, к-ый должен проверяться ф-цией maximum. Когда компилятор обнаруживает вызов maximum в исходном коде программы, этот тип данных, переданных в maximum, подставляется вместо Т всюду в опре­делении шаблона и С++ создает законченную ф-цию для определения мах-го из трех значений указанного типа данных. Затем заново создан­ная ф-ция компилируется. Т.о. шаблоны в действительности играют роль средств генерации кода. В программе обрабатыва­ются три ф-ции — одна ожидает три значения int, вторая ожидает три значения double и третья ожидает три значения char.

Ограничения:

- выполнение разл. действий невозможно

- нельзя сделать виртуальную ф-ю шаблоном

Передача параметра

<Туре> следует указывать везде, кроме трех мест в объявлениях классов или определениях их функций:

1. За ключевым словом class в самом начале.

2. При указании имени конструктора.

3. При указании имени деструктора.

Аргументы конструкторов и деструкторов д. б. параметризованными, как и все использования имени класса за исключением трех указанных случаев. При любом использовании параметризованного типа или ф-ии необходимо указывать параметр.

Вопрос 4. Использование const с указателями.

Если переменная объявлена с ключевым словом const, значит, она не должна меняться. После определения константной переменной уже нельзя изменить ее значение или передать ее в ка-ве аргумента ф-ции, к-ая не гарантирует ее неизменности.

В операциях с указателями используются два объекта: сам указатель и объект, на к-ый он ссылается. Помещение ключевого слова const перед объявлением указателя делает константой объект, а не указатель. Для объявления самого указателя в кач-ве константы используется оператор объявления *const, а не просто *.

Существует шесть возможностей использования (или не использования) const с параметрами ф-ции — две с передачей параметров по значению и четыре с передачей параметров по ссылке.

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

Наивысший уровень доступа предоставляется неконстантным указателем на неконстантные данные. Объявление неконстантного указателя на неконстантные данные не содержит const.

Неконстантный указатель на константные данные — это указатель, к-ый можно модифицировать, чтобы указывать на любые элементы данных подходящего типа, но данные, на к-ые он ссылается, не могут быть мо­дифицированы. Такой указатель можно было бы использовать, чтобы пере­дать аргументы массива ф-ции, к-ая будет обрабатывать каждый Эл-т массива без модификации данных.

const int* p;

int i = 17;

p = &i;

Константный указатель на неконстантные данные — это указатель, к-ый всегда указывает на одну и ту же ячейку памяти, данные в к-ой можно модифицировать посредством указателя. Этот вариант реализуется по умолчанию для имени массива. Имя массива — это константный указатель на начало массива. Используя имя массива и индексы массива можно об­ращаться ко всем данным в массиве и изменять их.

int i = 17;

int* const p1 = &i;

*p1 = 29; //величина, на к-ую ссылается указатель, может изменяться

Наименьший уровень привилегий доступа предоставляет константный указатель на константные данные. Такой указатель всегда указывает на одну и ту же ячейку памяти и данные в этой ячейке нельзя модифицировать (если массив нужно передать ф-ции, к-ая только просматривает массив, использует его индексы, но не модифицирует сам массив).

int i = 17;

int j = 29;

const int* const p1 = &i; // Можно

*p1 = 29; // Нельзя

p1 = &j; // Нельзя