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


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


char* format( int );

void g() {

   char *format( double );

   char* format( char* );

 

   format(3);   // вызывается format( double )

}

Так как format(int), объявленная в глобальной области видимости, скрыта, она не включается в множество функций-кандидатов.

Кандидаты могут быть введены с помощью using-объявлений, видимых в точке вызова:

namespace libs_R_us {

   int max( int, int );

   double max( double, double );

}

 

char max( char, char );

 

void func()

{

   // функции из пространства имен невидимы

   // все три вызова разрешаются в пользу глобальной функции max( char, char )

   max( 87, 65 );

   max( 35.5, 76.6 );

   max( 'J', 'L' );

}

Функции max(), определенные в пространстве имен libs_R_us, невидимы в точке вызова. Единственной видимой является функция max() из глобальной области; только она входит в множество функций-кандидатов и вызывается при каждом из трех обращений к func(). Мы можем воспользоваться using-объявлением, чтобы сделать видимыми функции max() из пространства имен libs_R_us. Куда поместить using-объявление? Если включить его в глобальную область видимости:

char max( char, char );

using libs_R_us::max;   // using-объявление

то функции max() из libs_R_us

добавляются в множество перегруженных функций, которое уже содержит max(), объявленную в глобальной области. Теперь все три функции видны внутри func() и становятся кандидатами. В этой ситуации вызовы func()

разрешаются следующим образом:

void func()

{

   max( 87, 65 );     // вызывается libs_R_us::max( int, int )

   max( 35.5, 76.6 ); // вызывается libs_R_us::max( double, double )

   max( 'J', 'L' );   // вызывается ::max( char, char )

}

Но что будет, если мы введем using-объявление в локальную область видимости функции func(), как показано в данном примере?

void func()

{

   // using-объявление

   using libs_R_us::max;

 

   // те же вызовы функций, что и выше

}

Какие из функций max()

будут включены в множество кандидатов? Напомним, что using-объявления вкладываются друг в друга. При наличии такого объявления в локальной области глобальная функция max(char, char) оказывается скрытой, так что в точке вызова видны только




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



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