8.5.9 Видимость Имен Членов

8.5.9 Видимость Имен Членов

Члены класса, описанные с ключевым словом class, являюся закрытыми, то есть, их имена могут использоваться только функциями членами (#8.5.2) и друзьями (см. #8.5.10), если они не стоят после метки «public:». В этом случае они являются открытыми. Открытый член может использоваться любой функцией. Struct является классом, все члены которого общие, см. #8.5.12.

Если производный класс описан как struct или если перед именем базового класса в описании производного класса стоит ключевое слово public, то общие члены базового класса являюся общими для производного класа; в остальных случаях они яляются закрытыми. Открытый член mem закрытого базового класса base может быть описан как общий для производного класса с помощью опиисания вида

typedef-имя :: идентификатор ;

в котором typedef-имя обозначает базовый класс, а идетификатор есть имя члена базового класса. Такое описание должно стоять в открытой части производного класса. Рассморим

class base (* int a; public: int b, c; int bf(); *);

class derived : base (* int d; public: base::c; int e; int df(); *);

int ef(derived amp;);

Внешняя функция ef может использовать только имена c, e и df. Являясь членом производного derived, функция df может использовать имена b, c, bf, d, e и df, но не a. Являясь члном базового base, функция bf может использовать члены a, b, c и bf.

8.5.10 Друзья

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

class private (* int a; friend void friend_set(private*, int); public: void member_set(int); *);

void friend_set (private* p, int i) (* p-»a = i; *)

void private::member_set (int i) (* a = i; *)

private obj; friend_set ( amp;obj,10); obj.member_set (10);

Если описание friend отностися к перегруженному имени или операции, то другом становится только функция, задаваемая типами параметров. Член класса cl1 может быть другом класса cl2. Например:

class cl2 (* friend char* cl1::foo(int); // ... *);

Все функции класса cl1 могут быть сделаны друзьями класа cl2 с помощью одного описания

class cl2 (* friend class cl1 ; // ... *);

Функция член, определенная (#10) в описании класса, яляется inline.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Поиск членов

Из книги автора

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


2.4. Предотвращение конфликта имен с помощью пространств имен

Из книги автора

2.4. Предотвращение конфликта имен с помощью пространств имен ПроблемаВ несвязанных между собой модулях обнаружены конфликтующие имена или требуется заранее избежать возможности таких конфликтов, создав логические группы кода.РешениеДля структурирования кода


Определение членов класса

Из книги автора

Определение членов класса Все члены класса по характеру доступа к ним делятся на четыре категории: закрытые (private), защищенные (protected), открытые (public) и опубликованные (published).Элементы класса, определенные в разделе public, без каких-либо ограничений открыты для доступа извне


Доступность членов

Из книги автора

Доступность членов Прежде чем двигаться дальше, мы должны обсудить вопрос доступности, или "видимости" членов. Члены (методы, поля, конструкторы и т.д.) данного класса или структуры должны указать свой уровень доступности. Если член определяется без указания ключевого


Тестирование переопределенных членов

Из книги автора

Тестирование переопределенных членов Теперь можно проверить обновленный класс Person. Добавьте следующий программный код в метод Main() и сравните результат его выполнения с тем, что показано на рис. 3.18.static void Main (string[] args) { // ВНИМАНИЕ: эти объекты должны быть идентичными. Person


Определение членов типов в CIL

Из книги автора

Определение членов типов в CIL Вы уже знаете, что типы .NET могут определить различные члены. Перечни содержат некоторый набор пар имен и значений. Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предыдущих 14 главах вы уже могли


Определение параметров членов

Из книги автора

Определение параметров членов Теперь предположим, что нужно определить методы, имеющие аргументы. По сути, указание аргументов в CIL (приблизительно) соответствует аналогичной операции в C#. Например, аргумент определяется с помощью указания типа данных после имени


8.6. Использование членов пространства имен А

Из книги автора

8.6. Использование членов пространства имен А Использование квалифицированных имен при каждом обращении к членам пространств может стать обременительным, особенно если имена пространств достаточно длинны. Если бы удалось сделать их короче, то такие имена проще было бы


14.5. Список инициализации членов

Из книги автора

14.5. Список инициализации членов Модифицируем наш класс Account, объявив член _name типа string:#include stringclass Account {public:// ...private:unsigned int _acct_nmbr;double _balance;string _name;};Придется заодно изменить и конструкторы. Возникает две проблемы: поддержание совместимости с первоначальным


17.2. Идентификация членов иерархии

Из книги автора

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


18.3.2. Открытие отдельных членов

Из книги автора

18.3.2. Открытие отдельных членов Когда мы применили закрытое наследование класса PeekbackStack от IntArray, то все защищенные и открытые члены IntArray стали закрытыми членами PeekbackStack. Было бы полезно, если бы пользователи PeekbackStack могли узнать размер стека с помощью такой


18.5.4. Видимость членов виртуального базового класса

Из книги автора

18.5.4. Видимость членов виртуального базового класса Изменим наш класс Bear так, чтобы он имел собственную реализацию функции-члена onExhibit(), предоставляемой также ZooAnimal: bool Bear::onExhibit() { ... }Теперь обращение к onExhibit() через объект Bear разрешается в пользу экземпляра, определенного в


Видимость членов класса и модификаторы доступа

Из книги автора

Видимость членов класса и модификаторы доступа Каждое поле, метод или свойство класса имеет модификатор (атрибут) доступа, задающий правила его видимости. В PascalABC.NET существуют четыре вида модификаторов доступа: public (открытый), private (закрытый), protected (защищенный) и internal


Обучение членов команд проекта

Из книги автора

Обучение членов команд проекта Планирование и реализация обучения членов команд проекта SAP позволяет им конфигурировать и тестировать предусмотренные Планом концептуального проектирования