1. Перегрузка и шаблоны функций

Цель перегрузки функции состоит в том, чтобы функция с одним именем по-разному выполнялась и возвращала разнообразные значения при обращении к ней с разными по типам и количеству фактическими параметрами. Для обеспечения перегрузки функции необходимо для каждого имени определить, сколько разных функций связано с ним (т. е. сколько вариантов сигнатур допустимы при обращении к ним).

.h

using namespace std;

class Datee

{

                int d, m, y;

public:

                Datee(int d, int m, int y)

                {

                               this->d = d;

                               this->m = m;

                               this->y = y;

                }

                Datee(int dd, int mm) : d(dd), m(mm), y(2006) {};

                Datee(int);

 

                void display()

                {

                               cout << "Date is " << d << " " << m << " " << y << "\n";

                }

};

 

Datee::Datee(int dd)

{

                d = dd;

                m = 3;

                y = 2006;

}

.cpp

#include "c_console.h"

 

int _tmain(int argc, _TCHAR* argv[])

{

                Datee d(1, 3, 2006);

                d.display();

                _getch();

                return 0;

}

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

В определении шаблона семейства функций используется служебное слово template. Для параметризации используется список формальных параметров шаблона, который заключается в угловые скобки < >. Каждый формальный параметр шаблона обозначается служебным словом class, за которым следует имя параметра (идентификатор).

Шаблон семейства функций состоит из двух частей заголовка шаблона: template <список_параметров_шаблона> и из обыкновенного определения функции. Имена параметров шаблона могут использоваться и в теле определения функции для обозначения типа локальных объектов.

 

.h

using namespace std;

template <class T, class Z>

void abc(T x, Z y)

{

                cout << x << " " << y << "\n";

}

 

.cpp

#include "c_console.h"

 

int _tmain(int argc, _TCHAR* argv[])

{

                abc(1, 1.99);

                abc(1.3, "qwe");

                abc("abc", 0.33);

                _getch();

                return 0;

}

 

.h

using namespace std;

 

template <class TT>

class Templater

{

public:

                Templater(TT x)

                {

                               cout << x << "\n";

                }

                Templater(TT x, TT y)

                {

                               cout << x << " " << y << "\n";

                }

};

 

.cpp

#include "c_console.h"

 

int _tmain(int argc, _TCHAR* argv[])

{

                Templater<int> (11);

                Templater<float> (1.1);

                Templater<int> (10, 232);

                _getch();

                return 0;

}

Основные свойства параметров шаблона:

- имена шаблона должны быть уникальны во всем определении шаблона;

- список параметров шаблона не может быть пустым;

- в списке параметров шаблона функции может быть несколько параметров. Каждый из них должен начинаться служебным словом class;

- недопустимо использовать в заголовке шаблона параметры с одинаковыми именами;

- имя параметра шаблона имеет в определяемой шаблоном функции все права имени типа.

 

Hosted by uCoz