C++.Бархатный путь




Совместно используемые функции - часть 4


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

    Объявляются четыре варианта совместно используемых функций. extern void FF(unsgned int); //Вариант 1... extern void FF(char*); //Вариант 2... extern void FF(char); //Вариант 3... extern void FF(int); //Вариант 4...

    И ещё несколько переменных различных типов... unsigned int iVal; int *p_iVal; unsigned long ulVal; Рассмотрим вызовы функций.

    • Успешные:

    FF('a'); //Успешное сопоставление с вариантом 3. FF("iVal"); //Успешное сопоставление с вариантом 2. FF(iVal); //Успешное сопоставление с вариантом 1.

    • Неудачные:

    FF(p_iVal); //Сопоставления нет. FF(ulVal); /* Поскольку по правилам стандартного преобразования тип unsigned long, пусть с потерей информации, но всё же может быть преобразован в любой целочисленный тип, сопоставление окажется неуспешным по причине своей неоднозначности. Сопоставление происходит со всеми вариантами функции за исключением функции, имеющей тип char*. */

    Решение относительно вызова совместно используемой функции с несколькими параметрами принимается на основе алгоритма сопоставления параметров к каждому из параметров вызова функции. При этом применяется так называемое правило пересечения. Согласно этому правилу, из множества совместно используемых функций выбирается функция, для которой разрешение каждого параметра будет НЕ ХУЖЕ (баллы по шкале соответствия), чем для всего множества совместно используемых функций, и ЛУЧШЕ (баллы по шкале соответствия), чем для всех остальных функций, хотя бы для одного параметра. Например:

    extern MyFFF(char*, int); extern MyFFF(int, int); MyFFF(0, 'a');




    Содержание  Назад  Вперед