- •Класс и атд
- •Классификация методов
- •Действия над объектами
- •Способы задания доступа
- •Область видимости класса
- •Указатель this
- •Функции-члены типа static и const
- •Перегрузка операторов
- •Доступные и недоступные для перегрузки операторы:
- •Перегрузка обычными функция, как компонентными
- •Примеры перегрузки операторов:
- •56. Параметрический полиморфизм: шаблонные классы и шаблонные функции - назначение, параметризованные типы данных, синтаксис и семантика.
Область видимости класса
Классы привносят новые правила определения области видимости в дополнение к существующим в ядре языка С. Одна из целей, преследуемых при использовании классов -обеспечить применение техники инкапсуляции. Это означает, что все имена, объявленные внутри класса, должны трактоваться внутри их собственного пространства имен, в отличие от внешних имей, имен функций и имен других классов. Появляется потребность в ведении оператора разрешения области видимости.
Оператор разрешения области видимости ::
Оператор разрешения области видимости является оператором самого высокого приоритета в языке. Он может принимать две формы:
:://унарный оператор — указывает на внешнюю область видимости
foo bar:://бинарный оператор — указывает на область видимости класса
Унарная форма используется для того, чтобы раскрыть имя (получить к нему доступ), которое имеет внешнюю область видимости и было скрыто объявлением в локальной области видимости или в области видимости класса:
В файле howmany.cpp
int count = 0; //внешняя переменная
void how_many(double w[], double x, int& count)
{for (int i = 0; i < N; ++i)
count += (w[i] == x) ; ++ ::count;}
Бинарная форма используется для того, чтобы устранить неоднозначность в именах, которые повторно используются в пределах класса, как показано ниже. Позже мы будем применять эту форму с наследованием и пространствами имен.
class widgets { public: void f(); };
class gizmos { public: void f(); };
void f() {/*что-нибудь*/} //просто внешняя функция f
void widgets::f{) {/*что-нибудь*/} // с областью видимости widgets
void gizmos::f() {/*что-нибудь*/} // с областью видимости gizmos
Отсутствие модификатора области видимости означает, что применяются обычные правила видимости имен.
Статические члены данных
Члены данных могут быть объявлены с использованием модификатора класса памяти static. Член данных, который объявлен как static, разделяется всеми переменными своего класса и хранится в одном месте. Нестатические члены данных создаются для каждого экземпляра класса. Если бы не наличие статических членов данных, сведения, необходимые всем экземплярам класса, должны были бы объявляться глобальными. Это разорвало бы отношения между данными и их классом, статический член позволяет данным класса, которые не специфичны для отдельного экземпляра, существовать в области видимости класса.
Так как статический член данных не зависит от конкретного экземпляра, к нему можно обратиться следующим образом:
имя-класса : : идентификатор
то есть используется оператор разрешения области видимости. Статический член глобального класса должен быть явно объявлен и определен в области видимости файла, щример:
Предпочтительным стилем программирования для доступа к статическим членам является использование разрешения области видимости. Доступ с использованием указателя и оператора «точка» может ввести в заблуждение; не видно, что член является статическим.
