Объекты и классы в языке С++. (Лекция 4)

Содержание

Слайд 2

Понятие класса

Класс - новый элемент программы на языке С++, который объединяет понятия

Понятие класса Класс - новый элемент программы на языке С++, который объединяет
структуры и функции.
Класс внутри себя может содержать разнотипные данные (как структура С/С++), а также функции для манипулирования этими данными и их обработки.
Смысл использования класса
Класс служит программной моделью какого-либо понятия из предметной области. Класс позволяет описать свойства объекта (через поля структуры) и его поведение (через набор функций).

Слайд 3

Простейший класс
#include
using namespace std;
class MyClass
{
public:

Простейший класс #include using namespace std; class MyClass { public: int data1;
int data1;
int data2;
void set(int a1, int a2)
{ data1 = a1; data2 = a2; }
void show()
{ cout << data1 << " "
<< data2 << endl; }
};
int main()
{
MyClass s1, s2;
s1.set(10, 5);
s2.data1 = 17;
s2.data2 = 21;
s1.show();
s2.show();
return 0;
}

Слайд 4

Объединение данных и функций для работы с ними - основной прием объектно-ориентированной

Объединение данных и функций для работы с ними - основной прием объектно-ориентированной
разработки программ.

Класс MyClass

int data1;
int data2;
...

void set(int, int);
void show();
...

данные

функции

Слайд 5

Определение класса
class имя_класса
{
спецификатор_доступа_1:
поле1;
поле2;
...
метод1;
метод2;

Определение класса class имя_класса { спецификатор_доступа_1: поле1; поле2; ... метод1; метод2; ...
...
спецификатор_доступа_2:
поле3;
метод3;
...
};

Поля - элементы данных, методы - функции для манипулирования данными.

Слайд 6

Использование класса

1) Создание объекта класса
имя_класса имя_объекта;

Примеры:
MyClass x,y; // x,y -

Использование класса 1) Создание объекта класса имя_класса имя_объекта; Примеры: MyClass x,y; //
объекты
MyClass *pointer; // указатель на объект
MyClass A[10]; // массив объектов

Слайд 7

2) Доступ к полям данных объекта
(только в случае, если доступ открыт)

2) Доступ к полям данных объекта (только в случае, если доступ открыт)

имя_объекта.имя_поля = значение;

Примеры:
x.data1 = y.data2 + 5;
pointer->data1 = 20;
A[3].data2 = 0;
указатель_на_объект->имя_поля = значение;

или

Слайд 8

3) Вызов метода объекта
(только в случае, если доступ открыт)
имя_объекта.метод(аргументы);

Примеры:
int a

3) Вызов метода объекта (только в случае, если доступ открыт) имя_объекта.метод(аргументы); Примеры:
= x.get ();
pointer->set(7,2);
A[7].show();
указатель_на_объект->метод(аргументы);

или

Слайд 9

Сокрытие данных (инкапсуляция)

Данные внутри класса (поля) могут быть защищены от несанкционированного доступа.

Сокрытие данных (инкапсуляция) Данные внутри класса (поля) могут быть защищены от несанкционированного
Защита производится с использованием механизмов разграничения доступа.

Спецификаторы доступа:
private (по умолчанию) - данные доступны только внутри этого класса,
protected - данные доступны внутри класса и из его потомков
public - данные доступны внутри класса, из его потомков, и извне.

Слайд 10

Инкапсуляция данных (пример)
class MyClass
{
private:
int data1;
int

Инкапсуляция данных (пример) class MyClass { private: int data1; int data2; public:
data2;
public:
void set(int a1, int a2)
{ data1 = a1; data2 = a2; }
void show()
{ cout << data1 << " "
<< data2 << endl; }
};
int main()
{
MyClass s1, s2;
s1.set(10, 5);
s2.data1 = 17;
s2.data2 = 21;
s1.show();
return 0;
}

ОШИБКА
ВРЕМЕНИ
КОМПИЛЯЦИИ
(доступ к полям data1
и data2 извне закрыт)

ОШИБКИ НЕТ
(метод show() имеет доступ
к полям data1 и data2)

Слайд 11

Разграничение доступа к данным: доступ внутри класса и извне

Разграничение доступа к данным: доступ внутри класса и извне

Слайд 12

class part // определение класса
{
private:
int modelnumber; // номер изделия

class part // определение класса { private: int modelnumber; // номер изделия

int partnumber; // номер детали
float cost; // стоимость детали
public:
void setpart(int mn, int pn, float c)
{
modelnumber = mn;
partnumber = pn;
cost = c;
}
void showpart()
{
cout << "Model " << modelnumber;
cout << ", part " << partnumber;
cout << ", costs $" << cost << endl;
}
};
int main()
{
part part1; // создаем объект
// вызываем методы
part1.setpart(624, 37, 217.5F);
part1.showpart();
return 0;
}

Файл "parts.h"

Файл "driver.cpp"

Слайд 13

Классы и объекты

Отношение объекта к своему классу такое же, как отношение переменной

Классы и объекты Отношение объекта к своему классу такое же, как отношение
к своему типу.
MyClass - новый пользовательский тип (класс),
s1 и s2 - переменные данного типа (объекты класса).
Пример отношения класса и объекта

Автомобиль (как транспортное средство)

Мой автомобиль (А322 ВС 34 rus)

Автомобиль соседа (Б344 СВ 34 rus)

Автомобиль жены (О187 ВЛ 34 rus)

Слайд 14

#include
using namespace std;
class Distance
{
private:
int feet;
float

#include using namespace std; class Distance { private: int feet; float inches;
inches;
public:
void setdist(int ft, float in)
{ feet = ft; inches = in; }
void getdist()
{
cout << "\nEnter feet: "; cin >> feet;
cout << "Enter inches: "; cin >> inches;
}
void showdist()
{ cout << feet << "\'-" << inches << '\"'; }
};
int main()
{
Distance dist1, dist2;
dist1.setdist(11, 6.25);
dist2.getdist();
cout << "\ndist1 = "; dist1.showdist();
cout << "\ndist2 = "; dist2.showdist();
cout << endl;
return 0;
}

Слайд 15

Конструктор класса (class constructor)

Для инициализации полей объекта могут использоваться специально разработанные методы

Конструктор класса (class constructor) Для инициализации полей объекта могут использоваться специально разработанные
класса. Однако гораздо удобнее инициализировать поля объекта автоматически в момент его создания. Такой способ реализуется с помощью особого метода класса, который называется конструктором.
Определение. Конструктор - это метод класса, который выполняется автоматически в момент создания объекта.

Слайд 16

Свойства конструктора

не имеет возвращаемого типа данных (даже void)
имеет то же имя,

Свойства конструктора не имеет возвращаемого типа данных (даже void) имеет то же
что и класс, в котором он объявлен,
допускается перегрузка конструктора (одно и то же имя, но различные параметры),
объявляется со спецификатором доступа public.

Конструктор похож на обычный метод класса, но имеет также особенности:

Слайд 17

Задачи конструктора:

1) создание объекта (размещение его в памяти)
2) инициализация полей объекта и

Задачи конструктора: 1) создание объекта (размещение его в памяти) 2) инициализация полей
определение инварианта класса.
В случае некорректности инварианта конструктор должен сообщить об ошибке.
Таким образом, корректно написанный конструктор всегда оставляет объект в «правильном» состоянии.

Инвариант класса — утверждение, которое должно быть истинно для любого объекта данного класса в любой момент времени

Слайд 18

Синтаксис определения конструктора
class имя
{
...
public:
имя(<аргументы>):<список_иниц-ции>
{
<тело_конструктора>
}

Синтаксис определения конструктора class имя { ... public: имя( ): { } ... };
...
};

Слайд 19

class Distance
{
private:
int feet;
float inches;
public:
Distance(int ft,

class Distance { private: int feet; float inches; public: Distance(int ft, float
float in)
{
feet = ft;
inches = in;
}
...
};
...

Пример 1: конструктор без списка инициализации.

Слайд 20

class Distance
{
private:
int feet;
float inches;
public:
Distance(int ft,

class Distance { private: int feet; float inches; public: Distance(int ft, float
float in):
feet(ft), inches(in) { }
...
};
...

Пример 2: конструктор со списком инициализации.

Слайд 21

Использование конструктора
имя_класса имя_объекта;

Конструктор почти никогда не вызывается явным образом. Вызов конструктора

Использование конструктора имя_класса имя_объекта; Конструктор почти никогда не вызывается явным образом. Вызов
происходит неявно всегда, когда создается объект данного класса.

А) Для инициализации объекта используется конструктор без параметров
имя_класса имя_объекта();

или

Слайд 22

Использование конструктора
имя_класса имя_объекта(параметры);

Б) Используется конструктор с параметрами

Примеры неявного использования конструктора:
MyClass A,B,C;
Distance

Использование конструктора имя_класса имя_объекта(параметры); Б) Используется конструктор с параметрами Примеры неявного использования
X(15, 2.85);

Слайд 23

Деструктор класса (class destructor)

Определение. Деструктор - это метод класса, который вызывается автоматически

Деструктор класса (class destructor) Определение. Деструктор - это метод класса, который вызывается
в момент удаления объекта из памяти.
Назначение деструктора – выполнить действия, необходимые для корректного освобождения объекта (освобождение памяти, закрытие файлов и т.д.).
Аналогично конструктору, деструктор не возвращает никакого значения, и имеет то же имя, что и класс (только со знаком «тильда»)

Слайд 24

class Distance
{
private:
int feet;
float inches;
public:
Distance(int ft,

class Distance { private: int feet; float inches; public: Distance(int ft, float
float in)
{
feet = ft;
inches = in;
}
~Distance()
{
feet = 0;
inches = 0;
}
};
...

Пример: деструктор класса