На этом шаге мы введем понятие класса, используя для этого понятие структуры.
Класс - это производный структурированный тип, введенный программистом на основе уже существующих типов. Механизм классов позволяет создавать типы в полном соответствии с принципами абстракции данных, т.е. класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными.
Простейшим образом класс можно определить с помощью конструкции:
ключ_класса имя_класса { список_компонентов };
где ключ_класса - одно из служебных слов class, struct, union; имя_класса - произвольно выбираемый идентификатор; список_компонентов - определения и описания типизированных данных и принадлежащих классу функций.
В проекте стандарта языка Си++ указано, что компонентами класса могут быть данные, функции, классы, перечисления, битовые поля, дружественные функции, дружественные классы и имена типов. Вначале для простоты будем считать, что компоненты класса - это типизированные данные (базовые и производные) и функции. Заключенный в фигурные скобки список компонентов называют телом класса. Телу класса предшествует заголовок. В простейшем случае заголовок класса включает ключ класса и его имя. Определение класса всегда заканчивается точкой с запятой.
Принадлежащие классу функции мы будем называть методами класса или компонентными функциями. Данные класса - компонентными данными или элементами данных класса.
В качестве ключа_класса можно использовать служебное слово struct, но класс отличается от обычного структурного типа, по крайней мере, возможностью включения компонентных функций. Например, следующая конструкция простейшим образом вводит класс "комплексное число":
struct complex1 // Вариант класса "комплексное число". { double real; // Вещественная часть. double imag; // Мнимая часть. // Определить значение комплексного числа: void define (double re = 0.0, double im = 0.0) { real = re; imag = im; } // Вывести на экран значение комплексного числа: void display(void) { cout << "real = " << real; cout << ", imag = " << imag;} };
В отличие от структурного типа в класс (тип) complex1, кроме компонентных данных (real, imag), включены две компонентные функции define() и display().
Обратим еще раз внимание на тот факт, что класс (как и его частный случай - структура), введенный пользователем, обладает правами типа. Следовательно, можно определять и описывать объекты класса и создавать производные типы:
complex1 X1, Х2, D; // Три объекта класса complex1. complex1 *point = &D; // Указатель на объект класса complex1. complex1 dim[8]; // Массив объектов класса complex1. complex1 &Name = X2; // Ссылка на объект класса complex1.
Итак, класс - это тип, введенный программистом. Каждый тип служит для определения объектов. Для описания объекта класса используется конструкция:
имя_класса имя_объекта;
В определяемые объекты класса входят данные (элементы), соответствующие компонентным данным класса. Компонентные функции класса позволяют обрабатывать данные конкретных объектов класса. Но в отличие от компонентных данных компонентные функции не тиражируются при создании конкретных объектов класса. Если перейти на уровень реализации, то место в памяти выделяется именно для элементов каждого объекта класса. Определение объекта класса предусматривает выделение участка памяти и деление этого участка на фрагменты, соответствующие отдельным элементам объекта, каждый из которых отображает отдельный компонент данных класса. Таким образом, и в объект X1, и в объект dim[3] класса complex1 входит по два элемента типа double, представляющих вещественные и мнимые части комплексных чисел.
На следующем шаге мы начнем рассматривать способы доступа к компонентам класса.