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




Перегрузка и область видимости * - часть 2


}

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

using libs_R_us::max;

using libs_R_us::print( double );   // ошибка

void func()

{

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

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

Первое using-объявление вводит обе функции libs_R_us::max в глобальную область видимости. Теперь любую из функций max() можно вызвать внутри func(). По типам аргументов определяется, какую именно функцию вызывать. Второе using-объявление – это ошибка: в нем нельзя задавать список параметров. Функция libs_R_us::print() объявляется только так:

using libs_R_us::print;

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

print( 88 );

автор пространства имен ожидает, что будет вызвана функция libs_R_us::print(int). Если разрешить пользователю избирательно включать в область видимости лишь одну из нескольких перегруженных функций, то поведение программы становится непредсказуемым.

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

#include <string>

namespace libs_R_us {

  extern void print( int );

  extern void print( double );

}

extern void print( const string & );

// libs_R_us::print( int ) и libs_R_us::print( double )

// перегружают print( const string & )

using libs_R_us::print;

void fooBar( int ival )

{

  print( "Value: ");   // вызывает глобальную функцию

                       // print( const string & )

  print( ival );       // вызывает libs_R_us::print( int )

}

Using-объявление добавляет в глобальную область видимости два объявления: для print(int) и для print(double). Они являются псевдонимами в пространстве libs_R_us и включаются в множество перегруженных функций с именем print, где уже находится глобальная print(const string &). При разрешении перегрузки print в fooBar рассматриваются все три функции.




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