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




Область видимости - часть 2


// сравниваем длины s1 и s2

int sizeCompare( const string &sl, const string &s2 ) { ... }

typedef int ( PFI)( const string &, const string & );

// сортируем массив строк

void sort( string *s1, string *s2, PFI compare =lexicoCompare )

    { ... }

string sl[10] = { "a", "light", "drizzle", "was", "falling",

                  "when", "they", "left", "the", "school" };

int main()

{

    // вызов sort() со значением по умолчанию параметра compare

    // s1 - глобальный массив

    sort( s1, s1 + sizeof(s1)/sizeof(s1[0]) - 1 );

    // выводим результат сортировки

    for ( int i = 0; i < sizeof(s1) / sizeof(s1[0]); ++i )

         cout << s1[ i ].c_str() << "\n\t";

}

Поскольку определения функций lexicoCompare(), sizeCompare() и sort() представляют собой различные области видимости и все они отличны от глобальной, в каждой из этих областей можно завести переменную с именем s1.

Имя, введенное с помощью объявления, можно использовать от точки объявления до конца области видимости (включая вложенные области). Так, имя s1 параметра функции lexicoCompare() разрешается употреблять до конца ее области видимости, то есть до конца ее определения.

Имя глобального массива s1 видимо с точки его объявления до конца исходного файла, включая вложенные области, такие, как определение функции main().

В общем случае имя должно обозначать одну сущность внутри одной области видимости. Если в предыдущем примере после объявления массива s1 добавить следующую строку, компилятор выдаст сообщение об ошибке:

void s1(); // ошибка: повторное объявление s1

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

В С++ имя должно быть объявлено до момента его первого использования в выражении. В противном случае компилятор выдаст сообщение об ошибке. Процесс сопоставления имени, используемого в выражении, с его объявлением называется разрешением. С помощью этого процесса имя получает конкретный смысл. Разрешение имени зависит от способа его употребления и от его области видимости. Мы рассмотрим этот процесс в различных контекстах. (В следующем подразделе описывается разрешение имен в локальной области видимости; в разделе 10.9 – разрешение в шаблонах функций;  в конце главы 13 – в области видимости классов, а в разделе 16.12 – в шаблонах классов.)

Области видимости и разрешение имен – понятия времени компиляции. Они применимы к отдельным частям текста программы. Компилятор интерпретирует текст программы согласно правилам областей видимости и правилам разрешения имен.




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