Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 5 Функции.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
219.14 Кб
Скачать

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); // неопределенность!

}

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