Перегрузка и область видимости

 

Функции, объявленные в различных областях видимости (не пространствах имён), не являются перегруженными. Например:

 

void f4(int);

 

void g() {

void f4(double);

f4(10); // вызывается f4(double)

::f4(2.5); // вызывается f4(int)

}

 

void f4(int a) { cout << "int" << a << endl; }

void f4(double a) { cout << "double" << a << endl; }

 

f4(int) была бы идеальным соответствием для вызова f4(10), но в данной области видимости находится только f4(double). Операция расширения области видимости:: делает видимой только глобальную область, поэтому вызову::f4(2.5) ставится в соответствие f4(int).

 

Если нужно, чтобы область действия перегрузки пересекала области видимости пространств имён, можно воспользоваться объявлением using. Объявление using вводит псевдоним для члена пространства имён в ту область видимости, в которой это объявление встречается, оно делает доступными все перегружен­ные функции с указанным именем:

 

void f4(int);

void g() {

void f4(double);

using::f4; // Доступна и f4(int)

f4(10); // Вызывается f4(int)

}

 

Если using-объявление вводит некоторую функцию в область видимости, в которой уже имеется функция с таким же именем и таким же списком параметров, это считается ошибкой.

 

Правила использования перегруженных функций:

 

1. Перегруженные функции должны находиться в одной области видимости, иначе произойдёт сокрытие их имён анало­гично одинаковым именам переменных во вложенных блоках.

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

3. Функции не могут быть перегружены, если списки их параметров отличаются только квалификатором const или использованием ссылки (например, int и const int, int и int &).

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

 

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

 

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

Рассмотрим шаблоны функций.

 

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

 

Формат определения шаблона (семейства) функций:

 

template <список_параметров_шаблона>


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: