Язык программирования C++ для профессионалов


Перегрузка имени функции - часть 2


Если найдены два сопоставления по самому приоритетному правилу, то вызов считается неоднозначным, а значит ошибочным. Эти правила сопоставления параметров работают с учетом правил преобразований числовых типов для С и С++. Пусть имеются такие описания функции print:

void print(int); void print(const char*); void print(double); void print(long); void print(char);

Тогда результаты следующих вызовов print() будут такими:

void h(char c, int i, short s, float f) { print(c); // точное сопоставление: вызывается print(char) print(i); // точное сопоставление: вызывается print(int) print(s); // стандартное целочисленное преобразование: // вызывается print(int) print(f); // стандартное преобразование: // вызывается print(double)

print('a'); // точное сопоставление: вызывается print(char) print(49); // точное сопоставление: вызывается print(int) print(0); // точное сопоставление: вызывается print(int) print("a"); // точное сопоставление: // вызывается print(const char*) }

Обращение print(0) приводит к вызову print(int), ведь 0 имеет тип int. Обращение print('a') приводит к вызову print(char), т.к. 'a' - типа char.

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

Исходя из этих правил можно гарантировать, что если эффективность или точность вычислений значительно различаются для рассматриваемых типов, то вызывается функция, реализующая самый простой алгоритм. Например:

int pow(int, int); double pow(double, double); // из <math.h> complex pow(double, complex); // из <complex.h> complex pow(complex, int); complex pow(complex, double); complex pow(complex, complex);

void k(complex z) { int i = pow(2,2); // вызывается pow(int,int) double d = pow(2.0,2); // вызывается pow(double,double) complex z2 = pow(2,z); // вызывается pow(double,complex) complex z3 = pow(z,2); // вызывается pow(complex,int) complex z4 = pow(z,z); // вызывается pow(complex,complex) }




Начало  Назад  Вперед



Книжный магазин