Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы с ответами ЯП.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
231.17 Кб
Скачать

6) Шаблоны функций.

Шаблоны функций - специальные функции, которые могут работать с универсальными типами. Это позволяет нам создавать шаблон функции, функциональность которого может быть адаптирована больше чем к одному типу или классу, не повторяя весь код для каждого типа. В C++ это может быть достигнуто, используя шаблонные параметры. Шаблонный параметр - специальный вид параметра, который может использоваться, чтобы передать тип как параметр: точно так же, как параметры регулярной функции могут использоваться, чтобы передать значения к функции, шаблонные параметры позволяют передавать также типы к функции. Эти шаблоны функций могут использовать эти параметры, как будто они были любым другим нормальным шрифтом. Формат для того, чтобы объявить шаблоны функций с параметрами типа: template <class identifier> function_declaration; Чтобы использовать этот шаблон функции, мы используем следующий формат для вызова функции: function_name <type> (parameters);

#include <iostream>

using namespace std;

template <class T>

T GetMax (T a, T b) {

T result;

result = (a>b)? a : b;

return (result);

}

int main () {

int i=5, j=6, k;

long l=10, m=5, n;

k=GetMax<int>(i,j);

n=GetMax<long>(l,m);

cout << k << endl;

cout << n << endl;

return 0;

}

Использование шаблонов функций уменьшает объем программирования, позволяя компилятору C++ генерировать операторы для функций, которые отличаются только типами возвращаемых значений и параметров.

7)Шаблоны классов.

По мере того как количество создаваемых вами классов растет, вы обнаруживаете, что некоторый класс, созданный для одной программы (или, возможно, для этой), очень похож на требующийся вам сейчас. Во многих случаях классы могут отличаться только типами. Другими словами, один класс работает с целочисленными значениями, в то время как требующийся вам сейчас должен работать со значениями типа float. Чтобы увеличить вероятность повторного использования существующего кода, C++ позволяет вашим программам определять шаблоны классов. Если сформулировать кратко, то шаблон класса определяет типонезависимый класс, который в дальнейшем служит для создания объектов требуемых типов. Если компилятор C++ встречает объявление объекта, основанное на шаблоне класса, то для построения класса требуемого типа он будет использовать типы, указанные при объявлении. Позволяя быстро создавать классы, отличающиеся только типом, шаблоны классов сокращают объем программирования, что, в свою очередь, экономит ваше время.

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

template<class T, class T1> class array

{  public:     array(int size);     T1 sum (void);     T average_value(void);     void show_array(void);     int add_value(T);  private:     T *data;     int size;     int index;  };

По умолчанию, все функции и переменные, объявленные в классе, становятся закрытыми (private). Т.е. они доступны только из других членов этого класса. Для объявления открытых членов класса используется ключевое слово public. Все функции-методы и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс.

Этот шаблон определяет символы типов T и T1. В случае массива целочисленных значений Т будет соответствовать int, а T1 — long. Аналогичным образом для массива значений с плавающей точкой значения Т и Т1 равны float. Теперь потратьте время, чтобы убедиться, что вы поняли, как компилятор С++ будет подставлять указанные вами типы вместо символов Т и Т1.

Далее, перед каждой функцией класса вы должны указать такую же запись со словом template. Кроме того, сразу же после имени класса вы должны указать типы класса, например array <T, T1>::average_value. Следующий оператор иллюстрирует определение функции average_value для этого класса:

template<class Т, class T1> Т array<T, T1>::average_value(void)

{     T1 sum = 0;     int i;     for (i = 0; i < index; i++) sum += data[i] ;     return (sum / index);  }

После создания шаблона вы можете создавать класс требуемого типа, указывая имя класса, а за ним в угловых скобках необходимые типы, как показано ниже:

Имя шаблона //----> array <int, long> numbers (100); <------//Типы шаблона                                       array <float, float> values(200);

БЛОК 2)