С++ для начинающих


         

.Устоявшие функции


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

class myClass {

public:

   void mf( double );

   void mf( char, char = '\n' );

   static void mf( int* );

   // ...

};

int main() {

   myClass mc;

   int iobj;

   mc.mf( iobj );  // какая именно функция-член mf()? Неоднозначно

}

В этом фрагменте для вызова mf() из main() есть две устоявшие функции:

void mf( double );

void mf( char, char = '\n' );

  • mf(double) устояла потому, что у нее только один параметр и существует стандартное преобразование аргумента iobj типа int в параметр типа double;
  • mf(char,char) устояла потому, что для второго параметра имеется значение по умолчанию и существует стандартное преобразование аргумента iobj типа int в тип char первого формального параметра.
  • При выборе наилучшей из устоявших функции преобразования типов, применяемые к каждому фактическому аргументу, ранжируются. Лучшей считается та, для которое все использованные преобразования не хуже, чем для любой другой устоявшей функции, и хотя бы для одного аргумента такое преобразование лучше, чем для всех остальных функций.

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

    Независимо от вида вызова функции, в множество устоявших могут быть включены как статические, так и нестатические члены:

    class myClass {

    public:

       static void mf( int );

       char mf( char );

    };

    int main() {

       char cobj;

       myClass::mf( cobj );  // какая именно функция-член?

    }

    Здесь функция-член mf() вызывается с указанием имени класса и оператора разрешения области видимости myClass::mf(). Однако не задан ни объект (с оператором “точка”), ни указатель на объект (с оператором “стрелка”). Несмотря на это, нестатическая функция-член mf(char) все же включается в множество устоявших наряду со статическим членом mf(int).




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