Статические компонентные данные и компонентные функции 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

СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ КЛАССА

Цель работы: изучить синтаксис и семантику определения и вызова конструкторов и деструкторов; приобрести практические навыки создания и уничтожения объектов; изучить особенности применения различных видов конструкторов.