- •Базовое ядро языка Элементы программы.
- •Комментарии
- •Инструкция – выражение
- •Инструкция
- •Определение функции
- •Заголовок функции
- •Прототипы функций
- •Аргументы по умолчанию.
- •Перегрузка функций
- •Встраиваемые функции
- •Стек до блока Вошли в блок Вышли из блока
- •Индексирование
- •Int a [100]; одномерный массив
- •Int b [3][5]; двухмерный массив
- •Int c [7][9][2]; трехмерный массив
- •Передача массивов функциям
- •Объявления ссылок и вызовов по ссылке
- •Функции-члены класса
- •Доступ: закрытый и открытый
- •Область видимости класса
- •Оператор разрешения области видимости ::
- •Вложенные классы
- •Статические члены данных
- •Указатель this
- •Функции-члены типа static и const.
- •Изменчивость (mutable)
- •Создание и уничтожение объектов
- •Классы с конструкторами
- •Конструкторы как преобразования
- •Создание динамического стека
- •Классы с деструкторами
- •Пример: динамически размещаемые строки
- •Ad hoc полиморфизм
- •Алгоритм выбора перегруженной функции
- •Перегрузка операторов
- •Перегрузка бинарных операторов
- •Перегрузка операторов присваивания и индексирования
- •Перегруженные операторы ввода-вывода « и »
- •Перегрузка оператора ( ) для индексирования
- •Операторы указателей
- •Указатель на член класса
- •Перегрузка new и delete
- •Наследование.
- •Методология объективно-ориентированного проектирования
- •Виртуальные функции
- •Абстрактные базовые классы
Область видимости класса
Классы привносят новые правила определения области видимости (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; //необходимо объявление