}; // Определение класса завершается символом «точка с запятой»!
Объектно-ориентированной разработке присущи следующие характерные свойства классов и объектов:
- инкапсуляция – объединение данных и кода в одно целое. Скрытие информации – имеется возможность запретить любой доступ к данным объекта, кроме как через его методы. Внутренняя структура объекта скрыта от пользователя;
- наследование – возможность создавать новые классы по принципу "от общего к частному". Наследование позволяет классам-потомкам при сохранении всех свойств классов-родителей добавлять свои собственные свойства, которые отражают их индивидуальность;
- полиморфизм – способность объектов выбирать реализацию метода на основе типов данных, принимаемых в сообщении. Объекты разных классов реагируют по-своему на одно и тоже сообщение. Это позволяет разным объектам иерархии классов реализовать своим собственным образом некоторый метод обработки данных (с одним и тем же именем для всех объектов).
Пример 4_1. Класс «Вектор»
Файл vector. h // определение класса вектор,
// его данных и методов
#ifndef _VECTOR_H //предотвращение многократного
#define _VECTOR_H //включения заголовочного файла
#include <iostream>
using std::endl;
using std::cout;
class VECTOR // Класс для работы с геометрическими векторами
{
//Данные
private:
int x, y; // координаты конца вектора
//Методы
public:
// Присвоить значения координатам вектора: подставляемый метод -
// определение метода дано в определении класса
void Assign(const int &x1, const int &y1)
{
x = x1; y = y1;
return;
}
// Печать значений координат вектора: объявление метода класса.
// Определение будет дано далее.
void print(void) const;
}; // завершение определения класса
// Определение метода print класса VECTOR
void VECTOR::print(void) const // const в конце заголовка метода –
//метод не может изменить данные класса
{
cout<<"\n Coordinates of a vector: x= "
<<x<<" y= "<<y<<endl;
return;
}
#endif _VECTOR_H
Файл class_vector.cpp // использование класса «Вектор»
#include "vector.h"
const int N = 5; // Число векторов в массиве
Int main()
{
// Создаем вектор v1 - объект класса VECTOR
// и массив векторов v_a - массив объектов класса VECTOR
VECTOR v1, v_a[ N ];
// Инициализируем и печатаем вектор v1
v1.Assign(0, 0); cout<<"\n Vector v1: "; v1.print();
// Инициализируем и печатаем массив векторов v _ a
for (int i = 0; i < N; i++)
{
v_a[i].Assign(i, i+1);
cout<<"\n Vector v_a["<<i<<"]:";
v_a[i].print();
}
cout<<endl;
system (" pause ");
return 0;
}
![]() |
Результат работы программы:
Для того, чтобы использовать объекты, как значения типа, объявленного разработчиком программы, класс должен обладать механизмом создания и уничтожения объектов. Таким механизмом являются конструкторы и деструкторы объектов.
Если класс не имеет конструктора, то инициализировать его объект при помощи списка значений (как структурную переменную) можно только в том случае, если все данные класса открытые (public).
Конструкторы и деструкторы
Конструктор – это метод (функция), имя которого совпадает с именем класса. Конструктор создает и инициализирует объект класса.
Конструктор автоматически вызывается при создании объекта: на первом этапе инициализируется конструктор, на втором – тело конструктора.
Конструкторов может быть несколько, при этом каждый конструктор со своим индивидуальным списком параметров.
Конструктор по умолчанию – конструктор, у которого отсутствуют параметры.
Конструктор копирования – конструктор, который вызывается: когда создается объект класса с инициализацией другим объектом; когда объект передается в функцию как параметр по значению; или когда метод класса возвращает в операторе return значение объекта.
Конструктор НЕ возращает значения!
Например, создание объекта класса VECTOR с помощью конструктора можно описать так:
Class VECTOR
{
//Данные
private:
int x, y; // координаты конца вектора
//Методы
public:
// Конструктор по умолчанию, без параметров.
// Подставляемый метод
VECTOR () { x = 0; y = 0;}
// Конструктор с параметрами и инициализацией данных класса
// значениями соответствующих параметров.
// При этом создание и инициализация объекта осуществляются
// на первом этапе работы конструктора; второй этап отсутствует –
// тело конструктора пусто
VECTOR (const int &x1, const int &y1): x (x1), y (y1){ }
// можно и так (но при этом создание и инициализация объекта
// осуществляются в два этапа работы конструктора):
// VECTOR (const int &x1, const int &y1) { x = x1; y = y1; }
// Конструктор копирования - вызывается при создании
// нового объекта с инициализацией другим объектом.
// Подставляемый метод
VECTOR (const VECTOR & copy) //объект copy - источник копирования
{
x = copy.x; y=copy.y;
}
...
};
При объявлении векторов, как в примере 4_1: VECTOR v 1, v _ a [ N ]; – конструктор по умочанию будет вызван 6 раз (один раз для v 1 и по одному разу длякаждого элемента массива v _ a). Все созданные объекты будут инициализированы нулевыми значениями.
Если используется определение VECTOR v 1 (10, 10) – то вызывается конструктор с параметрами и создается вектор с координатами x = 10, y = 10.
В случае определения VECTOR v 2 (v 1) вызывается конструктор копирования и создается вектор v 2 с координатами v 1. x, v 1. y.
Конструктор по умолчанию и конструктор с параметрами можно объединить в один конструктор. Например, для рассматриваемого класса VECTOR:
VECTOR (const int & x 1=0, const int & y 1=0): x (x 1), y (y 1) { }
Если конструктор копирования не создан разработчиком программы, то автоматически создается конструктор с поверхностным копированием. В случае с динамическими объектами копируется только указатель на объект, а копия объекта в динамической памяти не создается, что приводит к неправильной работе программы. Для примера 4_1 собственный конструктор копирования можно не создавать.
Деструктор – это метод (функция), имя которого совпадает с именем класса и начинается с символа ~ ( «тильда»). Деструктор предназначен для уничтожения объектов. Если конструктор не выполняет динамическое распределение памяти, то собственный деструктор кодировать не надо.
Деструктор вызывается не явно: когда объект класса выходит из области видимости (как переменная).
Деструктор всегда только один, НЕ имеет параметров и НЕ возращает значения!
Перегрузка операций для классов
Для того, чтобы сделать работу с объектами удобной и сответствующей предметной области использования объектов, С++ предоставляет возможность перегрузки стандартных операций для объектов пользовательских типов. Для этого следует разработать специальный метод класса (функцию-операцию) operator. Прототип такого метода в определении класса следующий:







