8.5.2. Оператор разрешения области видимости

8.5.2. Оператор разрешения области видимости

Имя члена пользовательского пространства дополняется поставленным спереди именем этого пространства и оператором разрешения области видимости (::). Использование неквалифицированного члена, например matrix, является ошибкой. Компилятор не знает, к какому объявлению относится это имя:

// определение интерфейса библиотеки

#include "primer.h"

// ошибка: нет объявления для matrix

void func( matrix m );

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

// определение интерфейса библиотеки

#include "primer.h"

class matrix { /* пользовательское определение */ };

// правильно: глобальный тип matrix найден

void func( matrix m );

то определение класса matrix компилятор находит в глобальной области видимости и программа компилируется без ошибок. Поскольку объявление matrix как члена пространства имен cplusplus_primer скрыто в этом пространстве, оно не конфликтует с классом, объявленным в глобальной области видимости.

Именно поэтому мы говорим, что пространства имен решают проблему засорения глобального пространства: имена их членов невидимы, если имя пространства не указано явно, с помощью оператора разрешения области видимости. Существуют и другие механизмы, позволяющие сделать объявление члена пространства имен видимым вне его. Это using-объявления и using-директивы. Мы рассмотрим их в следующем разделе.

Отметим, что оператор области видимости может быть использован и для того, чтобы сослаться на элемент глобального пространства имен. Поскольку это пространство не имеет имени, запись

::member_name

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

Следующий пример демонстрирует использование оператора области видимости для обращения к скрытому члену глобального пространства имен. Функция вычисляет последовательность чисел Фибоначчи. В программе два определения переменной max. Глобальная переменная указывает максимальное значение элемента последовательности, при превышении которого вычисление прекращается, а локальная – желаемую длину последовательности при данном вызове функции. (Напоминаем, что параметры функции относятся к ее локальной области видимости.) Внутри функции должны быть доступны обе переменных. Однако неквалифицированное имя max ссылается на локальное объявление этой переменной. Чтобы получить глобальную переменную, нужно использовать оператор разрешения области видимости ::max. Вот текст программы:

#include iostream

const int max = 65000;

const int lineLength = 12;

void fibonacci( int max )

{

if ( max 2 ) return;

cout "0 1 ";

int v1 = 0, v2 = 1, cur;

for ( int ix = 3; ix = max; ++ix ) {

cur = v1 + v2;

if ( cur ::max ) break;

cout cur " ";

vl = v2;

v2 = cur;

if (ix % "lineLength == 0) cout end"!;

}

}

Так выглядит функция main(), вызывающая fibonacci():

#include iostream

void fibonacci( int );

int main() {

cout "Числа Фибоначчи: 16 ";

fibonacci( 16 );

return 0;

}

Результат работы программы:

Числа Фибоначчи: 16

0 1 1 2 3 5 8 13 21 34 55 89

144 233 377 610