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




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


Все перегруженные функции объявляются в одной и той же области видимости. К примеру, локально объявленная функция не перегружает, а просто скрывает глобальную:

#include <string>

void print( const string & );

void print( double );         // перегружает print()

void fooBar( int ival )

{

  // отдельная область видимости: скрывает обе реализации print()

  extern void print( int );

  // ошибка: print( const string & ) не видна в этой области

  print( "Value: ");

  print( ival );              // правильно: print( int ) видна

}

Поскольку каждый класс определяет собственную область видимости, функции, являющиеся членами двух разных классов, не перегружают друг друга. (Функции-члены класса описываются в главе 13. Разрешение перегрузки для функций-членов класса рассматривается в главе 15.)

Объявлять такие функции разрешается и внутри пространства имен. С каждым из них также связана отдельная область видимости, так что функции, объявленные в разных пространствах, не перегружают друг друга. Например:

#include <string>

namespace IBM {

  extern void print( const string & );

  extern void print( double );   // перегружает print()

}

namespace Disney {

  // отдельная область видимости:

  // не перегружает функцию print() из пространства имен IBM

  extern void print( int );

}

Использование using-объявлений и using-директив помогает сделать члены пространства имен доступными в других областях видимости. Эти механизмы оказывают определенное влияние на объявления перегруженных функций. (Using-объявления и using-директивы рассматривались в разделе 8.6.)

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

namespace libs_R_us {

  int max( int, int );

  int max( double, double );

  extern void print( int );

  extern void print( double );




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