Скачиваний:
316
Добавлен:
28.03.2021
Размер:
378.53 Кб
Скачать

126. Использование стандартных параметров в параметризированных функциях и методах. Особенности использования параметризированных функций и методов.

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

template<class Х> void repeat(X data, int times)

{

do

{

cout << data << "\n";

times--;

}

while(times);

}

В этой программе функция repeat() отображает свой первый аргумент столько раз, сколько задано ее вторым аргументом. Поскольку первый аргумент имеет обобщенный тип, функцию repeat() можно использовать для отображения данных любого типа. Параметр times — стандартный, он передается по значению. Смешанное задание обобщенных и необобщенных параметров, как правило, не вызывает никаких проблем и является обычной практикой программирования.

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

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

Параметр по умолчанию (или ещё «необязательный параметр») — это параметр функции, который имеет определённое (по умолчанию) значение. Если пользователь не передаёт в функцию значение для параметра по умолчанию, то используется значение по умолчанию. Если же пользователь передаёт значение, то это значение используется вместо значения по умолчанию. Пример оформления: void printValues(int a, int b=5)

Параметр по умолчанию применяется, когда функция нуждается в значении, которое пользователь может переопределить, а может и не переопределить. Функция может иметь несколько параметров по умолчанию.

Если имеется более одного параметра по умолчанию, то самым левым параметром по умолчанию должен быть тот, который с наибольшей вероятностью (среди всех остальных параметров) будет явно переопределён пользователем.

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

53. Параметризированные классы, методы, их свойства. Явно задаваемые специализации параметризированных классов

Обобщенные классы особенно полезны в случае, когда в них используется логика, которую можно обобщить. Например, алгоритмы, которые поддерживают функционирование очереди целочисленных значений, также подходят и для очереди символов. Механизм, который обеспечивает поддержку связного списка почтовых адресов, также годится для поддержки связного списка, предназначенного для хранения данных о запчастях к автомобилям. После создания обобщенный класс сможет выполнять определенную программистом операцию (например, поддержку очереди или связного списка) для любого типа данных. Компилятор автоматически сгенерирует корректный тип объекта на основе типа, заданного при создании объекта.

Общий формат объявления обобщенного класса имеет следующий вид:

template <class Ttype> class имя_класса

{...} Здесь элемент Ttype представляет собой "заполнитель" для имени типа, который будет задан при реализации класса. При необходимости можно определить несколько обобщенных типов данных, используя список элементов, разделенных запятыми.

Создав обобщенный класс, можно создать его конкретный экземпляр, используя следующий общий формат.

имя_класса <тип> имя_объекта;

Здесь элемент тип означает имя типа данных, которые будут обрабатываться экземпляром обобщенного класса. Функции-члены обобщенного класса автоматически являются обобщенными. Поэтому вам не нужно использовать ключевое слово template для явного определения их таковыми. обобщенные функции и классы представляют собой мощные средства, которые помогут увеличить эффективность работы программиста, поскольку они позволяют определить общий формат объекта, который можно затем использовать с любым типом данных. Обобщенные функции и классы избавляют вас от утомительного труда по созданию отдельных реализаций для каждого типа данных, подлежащих обработке единым алгоритмом. Эту работу сделает за вас компилятор: он автоматически создаст конкретные версии определенного вами класса.

Явная специализация классов расширяет диапазон применения обобщенных классов, поскольку она позволяет легко обрабатывать один или два специальных случая, оставляя все остальные варианты для автоматической обработки компилятором. Но если вы заметите, что у вас создается слишком много специализаций, то тогда, возможно, лучше вообще отказаться от создания шаблонного класса.