Вход/Регистрация
Справочное руководство по C++
вернуться

Страустрап Бьярн

Шрифт:

};

Функции-члены можно вызывать из конструктора абстрактного класса, результат прямого или косвенного вызова чистой виртуальной функции для объекта, созданного с помощью такого конструктора, неопределен.

R.10.4 Сводка правил области видимости

Теперь можно свести воедино правила областей видимости для программы на C++. Эти правила одинаково применимы для всех имен (включая имя-typedef (§R.7.1.3) и имя-класса (§R.9.1)) и в любом контексте, для которого они допустимы по синтаксису языка. Здесь рассматриваются только области видимости на лексическом уровне, вопросы связывания обсуждаются в §R.3.3. Понятие момента описания было введено в §R.3.2.

Всякое использование имени должно быть однозначным (не считая перегрузки) в области его видимости (§R.10.1.1). Правила доступа (§R.11) начинают действовать только тогда, когда имя можно однозначно найти в области его видимости. Только при условии, что права доступа к имени не нарушены, начинается проверка типа объекта, функции или элемента перечисления.

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

Имя, задаваемое после X:: или obj., где obj типа X или типа ссылка на X, а также имя, задаваемое после ptr-›, где ptr типа указатель на X, должно быть именем члена класса X или членом базового по отношению к X класса. Помимо этого, в обращении ptr-›имя ptr может быть объектом класса Y, в котором есть функция operator-›, описанная таким образом, что ptr-›operator в конечном счете оказывается указателем на X (§R.13.4.6).

Имя, которое не уточняется одним из описанных выше способов, и, которое используется в функции, не являющейся членом класса, должно быть описано в том блоке, где оно используется, или в объемлющем блоке или должно быть глобальным. Описание локального имени скрывает описания того же имени в объемлющих блоках, а также его описания как глобального имени. В частности, перегрузка имени невозможна для имен в разных областях видимости (§R.13.4).

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

Имя, которое не уточняется одним из описанных выше способов, и, которое используется в статической функции-члене класса X, должно быть описано или в том блоке, где оно используется, или в объемлющем блоке, и должно быть статическим членом класса X, или базового по отношению к X класса, или оно должно быть глобальным именем.

Имя формального параметра функции, заданное при ее определении (§R.8.3), принадлежит области видимости, совпадающей с наибольшим блоком функции (в частности, является локальным именем). Имя формального параметра функции, заданное в ее описании (§R.8.2.5), а не определении, принадлежит локальной области видимости, которая исчезает сразу же после описания функции. Стандартные значения параметров находятся в области видимости, определяемой в момент описания (§R.3.2) формальных параметров функции; в них не должны использоваться локальные переменные или нестатические члены класса, и они вычисляются при каждом вызове функции (§R.8.2.6).

Инициализатор-ctor (§R.12.6.2) вычисляется в области видимости наибольшего блока конструктора, для которого он задан. В частности, в нем можно использовать имена формальных параметров.

R.11 Контроль доступа к членам

Член класса может быть:

• частным (private); это значит, что его имя можно использовать только в функциях-членах и друзьях класса, в котором он описан;

• защищенным (protected); это значит, что его имя можно использовать только в функциях-членах и друзьях класса, в котором он описан, а также в функциях-членах и друзьях классов, являющихся производными по отношению к этому классу (см. §R.11.5);

• общим (public); это значит, что его имя можно использовать в любой функции.

Члены класса, описанного со служебным словом class, являются частными по определению. Члены класса, описанного со служебным словом struct или union, являются общими по определению, например:

class X {

 int; // X:: частный по определению

};

struct S {

 int a; // S::a общий по определению

};

R.11.1 Спецификации доступа

Описания членов могут быть снабжены спецификацией доступа (§R.10):

спецификация-доступа: список-членов opt

Спецификация-доступа задает правила доступа к членам, которые действуют до конца жизни класса или пока не появится другая спецификация-доступа, например,

class X {

 int a; // X::a частный по определению: учитывается 'class'

public:

 int b; // X::b общий

  • Читать дальше
  • 1
  • ...
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: