
- •Тема 5 Функции
- •5.1 Синтаксис функций
- •5.2 Типизированные и нетипизированные функции. Оператор return
- •5.3 Автоматические и статические локальные переменные, глобальные переменные
- •5.4 Способы передачи параметров функциям
- •5.5 Передача массивов функциям
- •5.6 Функции специального назначения
- •5.6.1 Встроенные функции (inline-функции)
- •5.6.2 Рекурсивные функции
- •5.7.1 Аргументы функций по умолчанию
- •5.7.2 Перегрузка функций
- •5.7.3 Перегрузка функций и неопределенность
5.7.3 Перегрузка функций и неопределенность
При перегрузке функций можно создать ситуацию, в которой компилятор не сможет выбрать между двумя или более перегруженными функция-ми. Неопределенные ситуации являются ошибками, и программа, содержащая неопределенности, компилироваться не будет.
Основная причина, вызывающая неопределенность, связана с автоматическим преобразованием типов в C++ когда аргументы, использованные при вызове функции, преобразуются к типу параметров функции. Например, если объявить:
void Func (double);
void Func (float);
то такое объявление перегруженных функций не является ошибочным. Ошибка может возникнуть при вызове функций:
void main()
{
Func( 4.5 ); // вызов Func( double );
Func( 10 ); // неопределенность!
}
В первом случае не возникает неопределенности, поскольку вещественное число 4.5 автоматически преобразуется в C++ к типу double. Во втором случае при передаче целого числа, возникает неопределенность, поскольку компилятор не может определить, приводить это число к типу float или типу double. Неопределенность здесь вызвана не перегрузкой функции, а вызовом этой функции с неопределенным типом аргумента. Ситуацию можно исправить, вызвав функцию следующим образом:
Func ( (float)10 );
Другой способ возникновения неопределенности связан с использованием в перегруженных функциях параметров по умолчанию. Например:
void Func (int i, int j = 0);
void Func (int i);
main()
{
Func(10, 20); // вызов Func(int i, int j = 0);
Func (10); // неопределенность!
}
Здесь во втором вызове возникает двусмысленность, поскольку компилятор не знает, вызывать ли функцию с одним параметром, или же использовать функцию с двумя параметром, где один из них принимает значение по умолчанию. Таких ситуаций следует избегать.