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



         

.Функции-кандидаты


Функцией-кандидатом называется функция с тем же именем, что и вызванная. Предположим, что имеется такой вызов:

SmallInt si(15);

add( si, 566 );

Функция-кандидат должна иметь имя add. Какие из объявлений add() принимаются во внимание? Те, которые видимы в точке вызова.

Например, обе функции add(), объявленные в глобальной области видимости, будут кандидатами для следующего вызова:

const matrix& add( const matrix &, int );

double add( double, double );

int main() {

   SmallInt si(15);

   add( si, 566 );

   // ...

}

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

  • если фактический аргумент – это объект типа класса, указатель или ссылка на тип класса либо указатель на член класса и этот тип объявлен в пользовательском пространстве имен, то к множеству функций-кандидатов добавляются функции, объявленные в этом же пространстве и имеющие то же имя, что и вызванная:
  • namespace NS {

       class SmallInt { /* ... */ };

       class String { /* ... */ };

       String add( const String &, const String & );

    }

    int main() {

       // si имеет тип class SmallInt:

       // класс объявлен в пространстве имен NS

       NS::SmallInt si(15);

       add( si, 566 );  // NS::add() - функция-кандидат

       return 0;

    }

    Аргумент si имеет тип SmallInt, т.е. тип класса, объявленного в пространстве имен NS. Поэтому к множеству функций-кандидатов добавляется add(const String &, const String &), объявленная в этом пространстве имен;

    • если фактический аргумент – это объект типа класса, указатель или ссылка на класс либо указатель на член класса и у этого класса есть друзья, имеющие то же имя, что и вызванная функция, то они добавляются к множеству функций-кандидатов:
    • namespace NS {

         class SmallInt {

            friend SmallInt add( SmallInt, int ) { /* ... */ }

         };

      }

      int main() {

         NS::SmallInt si(15);




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