Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11275 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 12:

C++: статические члены класса и виртуальные функции

< Лекция 11 || Лекция 12: 123 || Лекция 13 >

Шаблоны методов

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

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

Шаблон метода - это еще одно проявление полиморфизма языка С++.

Шаблоны методов используют в качестве параметра тип переменной.

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

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

Например:

template <class T1> 
    T1 Fx (T1 x, T1 y) {return x+y;}

При использовании шаблона компилятор заменит для вызываемого метода тип шаблона на тип, указанный при вызове метода ( T1 на int в следующем примере).

Например:

int i1=1;
int i2=2; 
std::cout<<Fx(i1,i2);

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

Шаблоны классов позволяют определить параметризированный тип.

Шаблоны классов аналогично шаблонам функций позволяют на этапе компиляции создавать определения классов.

Шаблон класса указывается ключевым словом template, за которым в угловых скобках указывается список типов для создания параметризированного класса. Имя шаблона класса указывается после ключевого слова class.

Для создания объекта на основе шаблона класса после имени шаблона в угловых скобках указывается конкретный тип:

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

Например:

template <class T1>     // Описание шаблона класса
class A   
{
T1 x,y;
public:
    A();
    ~A();
    T1 Fx();
    void Fy(T1 a, T1 b);
};
template <class T1> A< T1>::A() {}    // Реализация методов шаблона класса
template <class T1> A< T1>::~A() {}
template <class T1>T1 A< T1>::Fx(){ return x*y;}
template <class T1>void A< T1>::Fy(T1 a, T1 b) {x=a; y=b;}

int main(int argc, char* argv[])
{       int i1=1;
       int i2=2; 
    double x=1.5; 
    double y=2.5;
    A <int> F1;       // Создание объекта с использованием шаблона класса
    A <int> *pF1=&F1;   // Указатель на объект параметризированного типа
    pF1->Fy(i1,i2);
    std::cout<<pF1->Fx()<<std::endl;
    A <double> F2;
    A <double> *pF2=&F2;
    pF2->Fy(x,y);
    std::cout<<pF2->Fx()<<std::endl;
      return 0;
}
Пример 12.2. Создание объекта на основе шаблона класса

Работа с памятью

Свободная память, которую можно заказывать в процессе выполнения программы, называется динамической памятью. Для выделения непрерывного блока памяти можно использовать функцию malloc(), а для освобождения - функцию free(). Прототипы этих функций расположены в заголовочном файле stdlib.h.

Например:

int *pIntBuffer;
// Выделение памяти под 5 переменных типа int
pIntBuffer=malloc(5*sizeof(int));

При отсутствии требуемого количества памяти функция malloc возвращает значение null.

Выделение динамической памяти также можно выполнять оператором new, а освобождение - оператором delete. Оператор new автоматически учитывает тип объекта и выделяет требуемое количество памяти.

Пример:

double *pBuffer;
// Выделение памяти под 10 переменных типа double
pBuffer=new double [10];
< Лекция 11 || Лекция 12: 123 || Лекция 13 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

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

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);