Перегрузка функций и неопределенность

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

Основная причина, вызывающая неопределенность, связана с автоматическим преобразованием типов в 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); // неопределенность!

}

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


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



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