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;
- недопустимо использовать в заголовке шаблона параметры с
одинаковыми именами;
- имя параметра шаблона имеет в определяемой шаблоном
функции все права имени типа.