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
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
2.4. Разрешения IPC
2.4. Разрешения IPC Новая очередь сообщений, именованный семафор или сегмент разделяемой памяти создается функциями mq_open, sem_open и shm_open, при условии, что аргумент oflag содержит константу O_CREAT. Согласно табл. 2.3, любому из данных типов IPC присваиваются определенные права доступа
3.5. Разрешения IPC
3.5. Разрешения IPC При создании нового объекта IPC с помощью одной из функций getXXX, вызванной с флагом IPC_CREAT, в структуру ipc_perm заносится следующая информация (раздел 3.3):1. Часть битов аргумента oflag задают значение поля mode структуры ipc_perm. В табл. 3.3 приведены биты разрешений для
R.10.4 Сводка правил области видимости
R.10.4 Сводка правил области видимости Теперь можно свести воедино правила областей видимости для программы на C++. Эти правила одинаково применимы для всех имен (включая имя-typedef (§R.7.1.3) и имя-класса (§R.9.1)) и в любом контексте, для которого они допустимы по синтаксису языка.
Обзор области видимости
Обзор области видимости Каждая VBA-процедура имеет свою вполне определенную область видимости. Область видимости определяет, из какой части программы вы можете вызвать эту процедуру, а из какой - нет. Можно сказать, что область видимости отвечает за то, какая часть
Задание области видимости процедуры
Задание области видимости процедуры Чтобы задать область видимости процедуры, нужно в начале объявления процедуры просто напечатать ключевое слово Public или Private. Взгляните на следующие примеры:Public Sub IKr.eadYouO...( операторы процедуры)End SubPrivate Function IKneedYou().. . (операторы
Задание области видимости переменной
Задание области видимости переменной Область видимости переменной (т.е. та часть программы, в рамках которой данная переменная доступна) зависит от следующих двух взаимосвязанных факторов:* места объявления переменной (либо внутри процедуры, либо в разделе объявлений
Правило 52: Если вы написали оператор new с размещением, напишите и соответствующий оператор delete
Правило 52: Если вы написали оператор new с размещением, напишите и соответствующий оператор delete Операторы new и delete с размещением встречаются в C++ не слишком часто, поэтому в том, что вы с ними не знакомы, нет ничего страшного. Вспомните (правила 16 и 17), что когда вы пишете такое
1. Оператор Select – базовый оператор языка структурированных запросов
1. Оператор Select – базовый оператор языка структурированных запросов Центральное место в языке структурированных запросов SQL занимает оператор Select, с помощью которого реализуется самая востребованная операция при работе с базами данных – запросы.Оператор Select
9.2. Три шага разрешения перегрузки
9.2. Три шага разрешения перегрузки Разрешением перегрузки функции называется процесс выбора той функции из множества перегруженных, которую следует вызвать. Этот процесс основывается на указанных при вызове аргументах. Рассмотрим пример:T t1, t2;void f( int, int );void f( float, float );int
13.9.1. Разрешение имен в области видимости класса
13.9.1. Разрешение имен в области видимости класса Конечно, имена, используемые в области видимости класса, не обязаны быть именами членов класса. В процессе разрешения в этой области ведется поиск имен, объявленных и в других областях. Если имя, употребленное в области
13.10.1. Разрешение имен в области видимости вложенного класса
13.10.1. Разрешение имен в области видимости вложенного класса Посмотрим, как разрешаются имена в определениях вложенного класса и его членов.Имя, встречающееся в определении вложенного класса (кроме тех, которые употребляются во встроенных функциях-членах и аргументах по
15.8.2. Оператор размещения new() и оператор delete()
15.8.2. Оператор размещения new() и оператор delete() Оператор-член new() может быть перегружен при условии, что все объявления имеют разные списки параметров. Первый параметр должен иметь тип size_t:class Screen {public:void *operator new( size_t );void *operator new( size_t, Screen * );// ...};Остальные параметры
3.3.1. Изменение разрешения экрана
3.3.1. Изменение разрешения экрана Начнем с изменения разрешения экрана. Щелкните правой кнопкой мыши на рабочем столе и выберите команду Разрешение экрана. В появившемся окне (рис. 3.10) вы можете выбрать экран, разрешение которого вы хотите изменить (если к системе
Переосмысление разрешения
Переосмысление разрешения Разрешение является основой современного права. Чтобы дать разрешение, лицо должно достигнуть определенного возраста и быть вменяемым; человек в состоянии опьянения или недееспособный подругой причине не может дать юридически значимое