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


.Функции-кандидаты - часть 2


/p>

}

Аргумент функции si

имеет тип SmallInt. Функция-друг класса SmallInt

add(SmallInt, int) – член пространства имен NS, хотя непосредственно в этом пространстве она не объявлена. При обычном поиске в NS

функция-друг не будет найдена. Однако при вызове add() с аргументом типа класса SmallInt принимаются во внимание и добавляются к множеству кандидатов также друзья этого класса, объявленные в списке его членов.

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

Рассмотрим следующий пример:

namespace NS {

   class SmallInt {

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

   };

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

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

}

 

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

double add( double, double );

 

int main() {

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

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

   NS::SmallInt si(15);

 

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

   return 0;

}

Здесь кандидатами являются:

·                  глобальные функции:

const matrix& add( const matrix &, int )

double add( double, double )

·                  функция из пространства имен:

NS::add( const String &, const String & )

·                  функция-друг:

NS::add( SmallInt, int )

При разрешении перегрузки выбирается функция-друг класса SmallInt NS::add( SmallInt, int ) как наилучшая из устоявших: оба фактических аргумента точно соответствуют заданным формальным параметрам.

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




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



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