Статические компонентные данные и компонентные функции static и const
Статические элементы данных хранятся в одном месте, являются общими для всех объектов класса и существуют независимо от них.
При вызове компонентная функция – объектная функция (а1, а2, а3); получает явный (а1, а2, а3) и неявный список аргументов (компонентные данные объекта). Неявные аргументы доступны посредством this.
Статическая компонентная функция доступа к компонентным данным не имеет, за исключением статических.
Обращение через оператор разрешения области видимости к статическим компонентным данным и функциям является предпочтительным:
class_type :: статический_элемент
class_type :: статическая_функция ( )
Именно так отражается тот факт, что элемент и функция являются статическими.
Компонентная функция, объявленная как const, не может изменять свои неявные аргументы, она получает неявный указатель:
const class_type * const this.
Изменчивость
Объекты класса могут быть объявлены как константы, и это гарантирует постоянство компонентных данных. Отказаться можно с помощью const_cast или индивидуально для отдельных компонентных данных с использованием ключевого слова mutable.
Вложенные классы
Классы могут быть созданы внутри блоков, в том числе внутри других классов, как часть реализации более сложной конструкции. Использование таких классов невозможно за пределами соответствующих блоков.
Вложение классов позволяет вкладывать определения функций - компонентная функция должна быть определена внутри своего локального класса, и на данную функцию нельзя ссылаться вне области видимости ее локального класса.
Пример:
class type {
public:
void f1 (int b) {x = b; y = 0;} // компонентная функция для доступа к x и y
void f2 (double k) {y = k*x;}
static void f3 (int c) {z = c;} //статическая компонентная функция для доступа только к z
int f4 ( ) const {return x+y+z;} // f4 не может изменять x, y, z
friend int f5 (const type & t); // дружественная классу type функция, аналог f4
private :
int x; //элемент данных индивидуальный для
int y; // каждого объекта
static int z; //статический элемент данных, общий для всех объектов
};
int type :: z = 10; // должен быть определен и инициализирован вне класса
main()
{ type w1,w2; //объявление объектов
w1.f1(100); // инициализация w1: x = 100, y = 0, z = 10
w2.f1(200); // инициализация w2: x = 200, y = 0, z = 10
w1.f2(0.5); // вычисление y в w1
w2.f2(0.8); // вычисление y в w2
type :: f3(300); // вызов f3 для изменения z в w1 и w2
cout <<”w1 = ”<<w1.f4( ) // сумма x, y, z в w1
<<”w2 = ”<<f5(w2)<<endl; // сумма x, y, z в w2
}
Задания
Разработайте алгоритм и программу, реализующую абстрактный тип данных (АТД) – класс, согласно варианту задания (см. раздел III). Предусмотрите закрытую реализацию и открытый интерфейс. Интерфейс должен содержать псевдоконструкторы и псевдодеструктор, функции присваивания, вывода содержимого и обработки (сортировка, поиск, сравнение, арифметические действия и т.д.).
Проверьте работоспособность АТД на тестовом наборе данных.
Контрольные вопросы
1. Дайте определение понятия «класс». Сформулируйте правила доступа к его элементам.
2. С какой целью в классе объединены компонентные данные и компонентные функции?
3. Каким образом осуществляется доступ к открытым и закрытым элементам?
4. Опишите назначение дружественных функций, назовите их разновидности.
5. Что понимается под указателем this?
6. Каковы особенности использования статических компонентных данных?
7. В чем заключается синтаксис и семантика компонентных функций static и const?
8. Каким образом могут изменяться компонентные данные объектов, объявленных константами?
9. Каковы особенности создания вложенных классов?
Раздел V
СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ КЛАССА
Цель работы: изучить синтаксис и семантику определения и вызова конструкторов и деструкторов; приобрести практические навыки создания и уничтожения объектов; изучить особенности применения различных видов конструкторов.