Лекция: Классы и объекты
Класс — это совокупность данных различных типов и функций для их обработки с атрибутами доступа к ним.
— Синтаксис определения класса:
class cl //cl — имя класса (идентификатор типа)
{
atr: //atr — атрибут доступа (private, public, protected)
tip1 per1; //элементы-данные
[...]
tf1 f1(tp1 p1[,...]);//прототипы элементов-функций
[...] //… новые атрибуты и новые элементы
[...] //конструкторы и деструкторы
};
Определение класса не резервирует память под элементы класса, это делает объявление объекта класса.
— Синтаксис объявления объекта класса: cl obj;
Атрибуты (спецификаторы доступа) осуществляют управление доступом к элементам класса:
— private — закрытые элементы, доступны только для элементов-функций данного класса и друзей класса;
— public — открытые элементы, доступны для любых функций;
— protected — защищенные элементы, доступны для элементов-функций данного класса и производных классов.
По умолчанию действует private.
Структуры и объединения рассматриваются как типы классов с атрибутом доступа public.
В многофайловых проектах целесообразно размещать определение класса с прототипами функций в файле заголовков, а определения функций — в файле кодов, причем перед именем функции ставится имя класса с операцией разрешения видимости (::).
Пример:
//файл заголовков //файл кодов
class akt void akt::vvod()
{ {
void vvod(); ...
}; }
Элементами класса служат элементы-данные и элементы-функции.
Элементы-данные — это совокупность взаимосвязанных данных различных типов, объявленная в определении класса.
Элементы-данные характеризуются свойствами:
— могут быть базового типа, массивами, типами, определяемыми пользователем, объектами ранее объявленного класса;
— не могут быть объектами данного класса, но могут быть указателями или ссылками на объекты данного класса;
— не могут быть явно инициализированы в теле класса (можно с помощью конструктора);
— не могут иметь спецификаторы auto, extern, register;
— могут иметь статический класс памяти static (существует только по одному экземпляру таких данных); они должны быть объявлены в определении класса в файле заголовков и определены в файле кодов, где могут быть инициализированы;
— могут быть именными константами (const); должны быть инициализированы (например, с помощью конструктора).
Пример:
//файл заголовков //файл кодов
class listok long listok::nadbavka;
{… ...
static long nadbavka;
const char* otdel;
};
Элементы-функции — это функции, объявленные в определении класса и обрабатывающие элементы-данные класса.
Элементы-функции характеризуются свойствами:
— определены внутри или вне определения класса;
— имеют доступ ко всем элементам данного класса;
— могут иметь статический класс памяти (static); такие функции могут обращаться только к статическим элементам класса и не могут быть объявлены const и virtual;
— могут быть константными (const ставится за списком параметров функции); такие функции не могут изменять значения элементов-данных класса.
Существуют еще специальные элементы-функции класса (конструкторы и деструкторы), служащие для создания, копирования, преобразования и уничтожения объектов класса.
Элементы класса имеют область действия этого класса. Доступ к элементам класса выполняется следующими способами:
— прямой доступ (по имени элемента) — из элементов-функций этого класса или из производных классов;
— через объект класса — из внешних функций или из других классов, например, во внешней функции имеем obj.sozdanie();, где obj — объект класса ved и sozdanie() — элемент-функция класса ved;
— через указатель на объект класса, например, pobj->vvod(), где pobj — указатель на объект obj класса akt (akt* pobj=&obj);
— через имя класса с операцией разрешения видимости (::), например, akt::chtenie_zap() или cena::chtenie_zap() при доступе из производного класса ved .
Схема доступа к элементам класса cl1 (без наследования):
class cl1 //внешняя функция или
{ //функция другого класса
private: cl1 obj; //или cl1* p=&obj;
int a; //доступ только к c и z()
void x(); //например,
protected: obj.z(); //или p->z();
int b; obj.c=10;//или p->c=10;
void y();
public:
int c;
void z();
}; //любая функция класса cl1 имеет доступ к a, x(), b, y(), c, z()