Язык программирования C++. Вводный курс


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


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

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);

 

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

   return 0;

<


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