Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры / ООП(Тимофеев) / ООП-Тимофеев.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
328.19 Кб
Скачать

Область видимости класса

Классы привносят новые правила определения области видимости (scope) в дополнение к существующим в ядре языка С. Одна из целей, преследуемых при использовании классов – обеспечить применение техники инкапсуляции. Это означает, что все имена, объявленные внутри класса, должны трактоваться внутри их собственного пространства имен, в отличие от внешних имен, имен функций и имен других классов. Появляется потребность в ведении оператора разрешения области видимости (scope resolution).

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

Оператор разрешения области видимости является оператором самого высокого приоритета в языке. Он может принимать две формы:

:: i // унарный оператор – указывает на внешнюю область видимости

foo_bar // бинарный оператор – указывает на область видимости класса

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

int count = 0; //внешняя переменная

void how_many (double w[ ], double х, int& count)

{ for (int = 0; i < N; ++i) count += (w[i] = = x); ++ :: count; }

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

Вложенные классы

Классы, также как блоки и пространства имен, могут быть вложены. Области видимости и вложенность позволяют локально скрывать имена и выделять ресурсы. Часто случается, что класс нужен как часть реализации некой большей конструкции.

char с; //внешняя область видимости ::с

class Х { //объявление объемлющего класса Х :: char с; //Х :: с

public: class Y{ //объявление вложенного класса Х ::Y::

public: void foo (char е) {Х t; ::с = t.Х::с = с = e;}

private:char с; //X :: Y :: c }; };

В классе Y функция-член foo ( ), используя :: с, ссылается на глобальную переменную с; используя X :: с, ссылается на переменную объемлющего класса; используя с, ссылается на переменную Х :: У :: с вложенного класса. Все три переменные с именем с доступны при использовании оператора разрешения области видимости.

Отметим, что С ++ позволяет вкладывать определения функций, используя вложение классов. Это ограниченная форма вложения функций. Функции-члены должны быть определены внутри локального класса и на них нельзя ссылаться вне его области видимости. Как и в С, простое вложение функций недопустимо.

Статические члены данных

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

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

имя-класса :: идентификатор

Здесь используется оператор разрешения области видимости. Статический член глобального класса должен быть явно объявлен и определен в области видимости файла. Например:

class str { public: static int how many; //объявление void print ( );

void assign (const char*); ….. private: //реализовано в виде символьного

char s [100]; //массива фиксированной длины

};

int str :: how_many = 0 //определение и инициализация

В нашем примере how_many может отслеживать, сколько памяти используется для хранение переменной str. Итак,

str sl, s2, s3, *p;

str :: how_many = 3; //предпочтительнее использовать ::

…..

str t;

t.how_many++; //оператор доступа «точка»

…..

р = new str;

р -> how many++; //оператор доступа через указатель

…..

delete p;

str::how_many--;

Предпочтительным стилем программирования для доступа к статическим членам является использование разрешения области видимости. Новым является разрешение инициализации статической константы в пределах объявления класса:

class ch_stаck {

…..

privatе:

static const int max_len = 10000; //инициализатор

…...

}; const stack :: int max_len; //необходимо объявление

Соседние файлы в папке ООП(Тимофеев)