Синтаксис описания класса
Основные элементы объектной модели
Абстракция
Инкапсуляция
Модульность
Иерархия
Полиморфизм
Класс: от требований к реализации
Управление доступом к членам класса
Классы и структуры С++
Класс как область видимости
Объявление и определение методов класса
Конструкторы
Классификация конструкторов
Пример объявления конструкторов
Деструкторы
Пример объявления деструктора
Пример конструкторов копирования
Пример конструкторов копирования
Перегрузка бинарных операций
371.20K
Category: programmingprogramming

Лекция по программированию 7 (Классы.Начало) (1)

1.

Классы и структуры в C++
• Обеспечивают механизм создания собственных
типов и определения различных действий над ними.
• Обычно используются для описания различных
понятий, фигурирующих в решаемой задаче.
• Акцентируют внимание разработчика на
моделировании данных, а не действий.
1

2.

5.2 Классы
Пример. Пусть имеется множество пар чисел (a, b).
Это множество можно
рассматривать как
множество рациональных
дробей:
Это множество можно
рассматривать как
множество
комплексных чисел:
Таким образом, класс полноценно определяет тип
данных как совокупность множества значений и
набора операций над этими значениями.
2

3.

Понятие терминов Класс и Объект
Класс — это сущность, которая задает общие свойства
и общее поведение для объектов (общий шаблон для
создания объектов). По сути класс является типом
данных.
Объект — это сущность в адресном пространстве
вычислительной системы, которая появляется при
создании экземпляра класса и обладает
определенным состоянием, уникальностью и
поведением.
3

4. Синтаксис описания класса

Элементы структуры могут представлять указатель на
class Имя_класса { определение_членов_класса };
Члены класса можно разделить на информационные
члены и функции-члены (методы) класса.
Данные, хранящиеся в информационных членах,
описывают состояние объекта, созданного на основе
класса.
Алгоритмы, заложенные в реализации методов класса,
определяют поведение объекта, то есть реагирование
объекта на поступающие внешние воздействия в виде
входных данных.
44

5. Основные элементы объектной модели

Концептуальной базой объектно-ориентированного стиля
программирования (ООП) является объектная модель,
основывающаяся на 4-х главных принципах:
1. Абстракция
2. Инкапсуляция
3. Модульность
4. Иерархия
Без следования любому из этих принципов модель не
будет объектно-ориентированной.
55

6. Абстракция

Абстракция выделяет существенные характеристики
некоторого объекта, отличающие его от всех других
видов объектов и, таким образом, четко определяет
его концептуальные границы с точки зрения
наблюдателя
Абстрагирование концентрирует внимание на
внешних характеристиках объекта и позволяет
отделить наиболее существенные особенности его
поведения от менее существенных
Граница между существенными и несущественными с
точки зрения разрабатываемой программной системы
особенностями поведения объекта называется
барьером абстракции
Главная задача ООП – выделение полного и
достаточного набора абстракций
6
6

7. Инкапсуляция

Инкапсуляция — это процесс отделения друг от друга
элементов объекта, определяющих его устройство и
поведение; инкапсуляция служит для того, чтобы
изолировать внешний интерфейс (то, что нам нужно
знать для работы с объектом) от внутренней
реализации.
Интерфейс отражает внешнее поведение абстракции,
специфицируя поведение всех объектов данного
класса
Внутренняя реализация описывает представление
этой абстракции и механизмы достижения желаемого
поведения объекта
77

8. Модульность

Модульность — это разделение программы на
фрагменты, которые компилируются по отдельности,
но могут устанавливать связи с другими модулями
Правильное разбиение программы на модули является
столь же важной задачей, что и выбор правильного
набора абстракций
Модуль является минимальной единицей
переиспользования и размещения
Реализация принципа модульности позволяет
уменьшить сложность системы.
Уровни модульности:
– Файлы, каталоги…
– Пространства имен, пакеты…
88

9. Иерархия

Позволяет упорядочить абстракции, сформировать
уровни абстрагирования, определить способы
взаимодействия абстракций, их отношения.
Иерархия — это упорядочение абстракций путем
расположения их по уровням
Виды иерархических отношений:
Иерархии классов (отношение «is a») – отношение вида
родитель-потомок, общее-частное. Реализуется с
помощью наследования типов (генерализации)
Иерархия объектов (отношение «part of») – отношение
вида целое часть. Реализуется агрегацией и
композицией
Отношение между классами и родовыми
компонентами (отношение «is like»). Позволяет
порождать целые семейства подобных типов
99

10. Полиморфизм

Полиморфизм — это возможность объектов с одинаковой
спецификацией иметь различную реализацию
«Один интерфейс, множество реализаций»
Задача
вычисления
площади
прямоугольника
S=a*b
b
a
double area(double a, double b)
{
return (a*b);
}
int area(int a, int b)
{
return (a*b);
}
10
10

11. Класс: от требований к реализации

Определить свойства рассматриваемой сущности,
важные для данной задачи
Определить основные действия
Определить, какой набор данных достаточен для
описания этих свойств
Определить список функций (методов),
соответствующих требуемым действиям
11
11

12. Управление доступом к членам класса

Принцип инкапсуляции обеспечивается вводом в класс
областей доступа:
− private (закрытый, доступный только собственным методам)
− public (открытый, доступный любым функциям)
− protected (защищенный, доступный только собственным
методам и методам производных классов)
При описании класса каждый член класса помещается в
одну из перечисленных выше областей доступа
следующим образом:
class

};
Имя_класса {
private:
определение_закрытых_членов_класса
public:
определение_открытых_членов_класса
protected:
определение_защищенных_членов_класса
12
12

13.

Открытый(public) доступ
Результат программы
13

14.

Защищенный(protected) доступ
Результат программы
14

15.

Закрытый(private) доступ
Результат программы
15

16. Классы и структуры С++

Класс С++ отличается от структуры С++ только
определением по умолчанию первой области
доступа в их описании:
− для структур умолчанием является открытый доступ
(public)
− для классов умолчанием является закрытый доступ
(private)
Структуры наравне с классами можно использовать для
полноценного описания типов данных, включающего
описания операций, применяемых к описываемому
типу данных.
Для доступа к внутренним информационным членам
объекта, созданного на основе класса, необходимо
использовать специальные методы класса, называемые
модификаторами (setters) и селекторами (getters).
16
16

17. Класс как область видимости

Класс является областью видимости описанных в нем
членов класса
Идентификатор члена класса локален по отношению к
данному классу
Классы могут быть вложенными
Одноименные идентификаторы членов класса
закрывают видимость соответствующих внешних
идентификаторов
Операция « :: » позволяет получить доступ к
одноименным объектам, внешним по отношению к
текущей области видимости, в частности, к глобальным
функциям и переменным, следующим образом:
имя_класса :: имя_члена_класса
или
:: имя - для имен глобальных функций и
17
переменных
17

18. Объявление и определение методов класса

Каждый метод класса, должен быть определен в
программе
Определить метод класса можно либо непосредственно в
классе либо вынести определение вне класса, а в классе
только объявить соответствующий метод, указав его
прототип
При определении метода класса вне класса для указания
области видимости соответствующего имени метода
используется операции « :: »:
Пример: class x {
int ia1;
public:
x(){ia1 = 0;}
int func1();
};
int x::func1(){ … return ia1; }
18
18

19. Конструкторы

Конструктор — это метод класса который всегда
вызывается при создании экземпляра класса (объекта).
Конструкторы предназначены для создания объектов
класса, и для инициализации атрибутов объекта.
Особенности описания конструктора
1) Имя конструктора совпадает с именем класса
2) При описании конструктора не указывается тип возвращаемого
значения (т.е. конструктор может принимать параметры, но никогда
не возвращает значения)
3) Класс может содержать несколько конструкторов (перегрузка
конструкторов), однако в классе не может быть двух конструкторов с
одинаковым набором параметров.
4) Если в классе не объявлен конструктор, то компилятор предоставит
конструктор по умолчанию (стандартный конструктор).
5) Стандартный конструктор не принимает параметров и не выполняет
никаких действий.
19
19

20. Классификация конструкторов

Конструкторы можно классифицировать разными
способами:
1) по наличию параметров:
− без параметров,
− с параметрами;
2) по количеству и типу параметров:
− конструктор умолчания (не содержит параметров),
− конструктор преобразования (содержит 1 параметр),
− конструктор копирования,
− конструктор с двумя и более параметрами.
20
20

21. Пример объявления конструкторов

class Rational
{
// Числитель
int numer;
// Знаменатель (>=1)
int denom;
public:
Rational();
Rational(int n,
int d);
int getNumer();
int getDenom();
};
//конструктор умолчания
Rational::Rational()
{
std::cout << "Call the default
constructor" << std::endl;
numer = 0;
denom = 1;
}
//конструктор с двумя и более параметрами
Rational::Rational(int n, int d)
{
std::cout << "Call constructor with
parameters" << std::endl;
numer = n;
denom = d;
}

int main()
{
Rational r;
Rational r2(2, 3);
21
}

22. Деструкторы

Деструктор — это метод класса который предназначен для
уничтожения экземпляров класса, а также для
освобождения ресурсов используемых в объектах класса
(например освобождение памяти).
Особенности деструкторов
1) Деструктор не принимает параметров и не может возвращать
значение.
2) Класс может иметь только один деструктор.
3) Имя деструктора начинается символом «~»
4) Деструкторы не могут перегружаться.
5) Деструкторы невозможно вызвать, они вызываются автоматически.
6) Если в классе не объявлен деструктор, то компилятор предоставит
деструктор по умолчанию (стандартный деструктор). Стандартный
деструктор не выполняет никаких действий.
7) Деструктор всегда вызывается при выходе объекта за пределы
области видимости
22
22

23. Пример объявления деструктора

Rational::~Rational()
{
std::cout << "Call destructor" <<
std::endl;
}

int main()
{
Rational r;
Rational r2(2, 3);
}
23

24. Пример конструкторов копирования

class Human{
// конструктор копирования
public:
Human::Human(const Human&
int Age;
CopySource) {
char* Name;
cout << "Copy constructor: copying
Human(int age, const char* name);
from MyString" << endl;
Human(const Human& CopySource);
if(CopySource.Name != NULL){
~Human();
Name = new char
};
[strlen(CopySource.Name) + 1];
//конструктор с 2 и более параметрами
Human::Human(int age, const char* name){ strcpy(Name, CopySource.Name);}
cout << "constructor" << endl;
else
Age = age;
Name = NULL;
if (name != NULL)
{
}
Name = new char (strlen(name) + 1);
//функция для вызова
strcpy(Name, name);
void showFunc(Human object) {
}
cout << "Function takes a
else
parameter" << endl;
Name = NULL;
}
}
//деструктор
int main() {
Human::~Human(){
Human human1(18, "Tom");
cout <<"-destructor" << endl;
showFunc(human1) ;
if (Name != NULL)
return 0;
delete [] Name;
24
}
}

25. Пример конструкторов копирования

class Human{
// конструктор копирования
public:
Human::Human(const Human&
int Age;
CopySource) {
char* Name;
cout << "Copy constructor: copying
Human(int age, const char* name);
from MyString" << endl;
Human(const Human& CopySource);
if(CopySource.Name != NULL){
~Human();
Name = new char
};
[strlen(CopySource.Name) + 1];
//конструктор с 2 и более параметрами
Human::Human(int age, const char* name){ strcpy(Name, CopySource.Name);}
cout << "constructor" << endl;
else
Age = age;
Name = NULL;
if (name != NULL)
{
}
Name = new char (strlen(name) + 1);
//функция для вызова
strcpy(Name, name);
void showFunc(Human object) {
}
cout << "Function takes a
else
parameter" << endl;
Name = NULL;
}
}
//деструктор
int main() {
Human::~Human(){
Human human1(18, "Tom");
cout <<"-destructor" << endl;
showFunc(human1) ;
if (Name != NULL)
return 0;
delete [] Name;
25
}
}

26. Перегрузка бинарных операций

Прототип перегруженной операции:
Тип_возвращаемого
значения
operator
символ
(операнды) {тело_функции};
оператора
Перегружать операции можно с помощью:
− функции-члена;
− функции-друга;
− глобальной функции (как правило, менее эффективно);
Можно перегружать любые операции языка С++, кроме следующих:
− . операция выбора члена класса
− :: операция разрешения области видимости
− ? : условная операция (например, j = i>0 ? 1 : 0;)
− .* операция разыменования указателя на член класса
− # директива препроцессора
− sizeof
26
− typeid
English     Русский Rules