Для подтверждения авторства введите
e-mail, указанный при добавлении материала.
На этот адрес электронной почты будет отправлена ссылка для редактирования

конспект урока Конспект лекции по теме "Шаблоны функций. Шаблоны классов"

Лекция Шаблоны

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

1.     Обобщенные функции (шаблон функции)

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

Общий формат определения шаблонной функции имеет следующий вид.
template <class Ttype> тип имя_функции(список_параметров)
{
тело функции
}
Здесь элемент Ttype представляет собой “заполнитель” для типа данных, обрабатываемых функцией.

Пример 1: Нужно запрограммировать функцию, которая выводила бы на экран элементы массива. Чтобы написать такую функцию, мы должны знать тип данных массива, который будем выводить на экран. Но — тип данных не один, мы хотим, чтобы функция выводила массивы типа int, double, float и char.

Задача усложнилась. Нужно запрограммировать целых 4 функции, которые выполняют одни и те же действия, но для различных типов данных. Чтобы не писать 4 функции определяют шаблон:
// начало шаблона функции printArray

template <typename T>

void printArray(const T * A, int n)

{

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

        cout << A [i] << "   ";

    cout << endl;

} // конец шаблона функции printArray

int main()

{

        // массивы разных типов данных

    int    A[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    double B[7] = {1.2345, 2.234, 3.57, 4.67876, 5.346, 6.1545, 7.7682};

    float  C[10] = {1.34, 2.37, 3.23, 4.8, 5.879, 6.345, 73.434, 8.82, 9.33, 10.4};

    char   D[5] = {"MARS"};

    // вызов локальной версии функции printArray для типа int через шаблон

    printArray(A, 10);

    // вызов локальной версии функции printArray для типа double через шаблон

printArray(B, 7);

    // вызов локальной версии функции printArray для типа float через шаблон

    printArray(C, 10);

    // вызов локальной версии функции printArray для типа char через шаблон

printArray(D, 5);

    return 0;

}

Ключевые слова typename и class, с предварительным обозначением их ключевым словом template, семантически не различаются. Ключевое слово typename говорит о том, что в шаблоне будет использоваться встроенный тип данных, такой как: int, double,float, char и т. д. А ключевое слово class сообщает компилятору, что в шаблоне функции в качестве параметра будут использоваться пользовательские типы данных, то есть классы.

Пример 2: В следующем примере создается обобщенная функция, которая меняет местами значения двух переменных, используемых при ее вызове.

// Определение шаблонной функции
template <typename X> void swap(X &a, X &b)

 // X – это  обобщенный тип данных.
{
X temp;

temp = a;
a = b;
b = temp;

} //конец шаблона
int main()
{
int i=10, j=20;
double x=10.1, y=23.3;
char a='x', b='z';
// Компилятор автоматически создает версии функции
// swap() с нужным значением аргументов
swap(i, j); // перестановка целых чисел
swap(x, y); // перестановка значений с плавающей точкой
swap(a, b); // перестановка символов
return 0;
}

Примечание: Поскольку тип аргумента функции, передаваемый в тип Х, может быть классом, а классы, как правило, не рекомендуется передавать по значению, то лучше сделать параметры и возвращаемое значение шаблона функции константными ссылками (&a и &b)
Пример3: Функция с двумя обобщенными типами
В template-инструкции можно определить несколько обобщенных типов данных, используя список элементов, разделенных запятой. Например, в следующей программе создается шаблонная функция с двумя обобщенными типами.
#include <iostream>
using namespace std;
template <class Type1, class Type2> // Два обобщенных типа.
void myfunc(Type1 x, Type2 y)
{ cout << x << ' ' << y << '\n'; 12
}
int main()
{
myfunc(10, "Привет");
myfunc(0.23, -10);
return 0;
}

2.     Обобщенные классы (шаблоны классов)

а) Помимо обобщенных функций, можно также определить обобщенный класс. Для этого создается класс, в котором определяются все используемые им алгоритмы; при этом реальный тип обрабатываемых в нем данных будет задан как параметр при создании объектов этого класса.

После создания обобщенный класс сможет выполнять определенную программистом операцию для любого типа данных. Компилятор автоматически сгенерирует корректный тип объекта на основе типа, заданного при создании объекта.
Общий формат объявления обобщенного класса имеет следующий вид:
template <class Ttype> class имя_класса {
// тело класса
}

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

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

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

// Пример простого обобщенного класса.

template <class T> class MyClass {

 // Объявление обобщенного класса. Здесь T - обобщенный тип.

// поля класса

T x, y;

//конструктор класса

public:

MyClass(T a, T b) {

x = a;

y = b;

}

//метод класса

T div() { return x/y; }

};

int main()

{

// Создаем версию класса MyClass для doubles-значений.

// Создание конкретного экземпляра обобщенного класса.

MyClass<double> d_ob(10.0, 3.0);

cout << "Результат деления double-значений: "<< d_ob.div() << "\n";

// Создаем версию класса MyClass для int-значений.

MyClass<int> i_ob(10, 3);

cout << "Результат деления int-значений: "<< i_ob.div() << "\n";

return 0;

}

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

#include <iostream>

using namespace std;

// Объявление обобщенного класса.

template <class T1, class T2> class MyClass

{

T1 i;

T2 j;

public:

//конструктор класса

Myclass(T1 a, T2 b) { i = a; j = b; }

//метод класса

void show() { cout << i << ' ' << j << '\n'; }

};

int main()

{

MyClass<int, double> ob1(10, 0.23);

MyClass <char, char *> ob2('X', "Это тест.");

ob1.show(); // отображение int- и double-значений

ob2.show(); // отображение значений типа char и char *

return 0;

}

Эта программа генерирует такие результаты.

10  0.23

X  Это тест.

В данной программе объявляется два вида объектов. Объект ob1 использует данные типа int и double, а объект ob2 — символ и указатель на символ. Для этих ситуаций компилятор автоматически генерирует данные и функции, соответствующие конкретному способу создания объектов.

Раздел: Конспекты уроков по информатике для 11 класса
Автор:
ГБПОУ РМ "Саранский техникум энергетики и электронной техники им. А.И. Полежаева"
Дата публикации: 22.05.2026
© При использовании материала ссылка на автора и сайт обязательна!
  Получить выходные данные
  Внести правки в свой материал

 Выходные данные (библиографическая ссылка):

Менякина Ж. В. Конспект лекции по теме "Шаблоны функций. Шаблоны классов" // Международный каталог для учителей, преподавателей и студентов «Конспекты уроков» // URL: https://xn----dtbhtbbrhebfpirq0k.xn--p1ai/informatika/11-klass/file/135213-konspekt-lektsii-po-teme-shablony-funktsij-shablony-klassov (дата обращения: 03.06.2026)
  Скачать сертификат о публикации
  Заказать рецензию на публикацию