ООП и раздельная компиляция поля
ПАРАДИГМЫ ПРОГРАММИРОВНИЯ
Парадигма программирования - это совокупность идей и понятий, определяющих стиль написания программ.
Не определяется однозначно языком программирования. Практически все современные языки программирования в той или иной мере допускают использование различных парадигм.
Существуют основные модели (виды) программирования:
- функциональное программирование - это способ программирования, основанный на использовании под программ (функций и процедур)
- структурное программирование - это способ программирования, основанный на представлении программы в виде иерархической структуры блоков
- декларативное программирование - это способ программирования, в котором описывается, что представляет собой проблема и что должно получиться в результате
- императивное программирование - это способ программирования, в котором программа состоит из набора инструкций, выполняемых последовательно
- логическое программирование - это способ программирования, основанный на автоматическом доказательстве теорем
- объектно-ориентированное программирование
Объектно-ориентированное программирование бывает:
- основанное на классах;
- основанное на прототипах;
- основанное на субъектах.
Объектно-ориентированное программирование, основанное на прототипах - это парадигма, которая позволяет переопределять и добавлять новые функции уже существующим объектам посредствам создания прототипов.
|
|
Прототип - это функция, которая может быть привязана к определенному объекту.
- субъектно-ориентированное программирование - это способ программирования, основанный на построении ООП-систем, как композиции субъектов.
Объектно-ориентированное программирование основанное на классах
Ключевыми понятиями ООП, основанного на классах, является класс и объект. Класс - это программная единица, представляющая собой совокупность характеристик какой-либо сущности и действий, которые эта сущность может выполнять.
Характеристики называются свойствами, действия - методами, сущность - объектом.
Фактически, класс - тип данных, определяемый пользователем и описывающий сущность.
Объект - это переменная типа «класс» или экземпляр «класса»
Свойства объектно-ориентированного программирования
Принято считать, что ООП рядом свойств:
1. Инкапсуляция - это объединение в единое целое свойств и методов с одновременным скрытием информации, которая не нужна для внешнего использования.
2. Наследование - это свойство ООП, позволяющие в одном классе использовать полностью или частично функционал другого класса. Класс, от которого берется функционал или его часть, называется родительский класс, а который берет функционал - дочерний
|
|
3. Полиморфизм - это свойство ООП, при котором одно и тоже имя может вызывать различные действия на этапе выполнения. В практике программирования проявляется в двух случаях:
- при создании объектов;
- при передаче объектов в виде аргументов в методы других классов
В практике программирования выделяют также четвертое свойство ООП:
Абстрагирование - это свойство ООП, при котором класс может содержать только описание (декларации) тех или иных методов и свойств без их реализации. Такие классы используются в основном в тех случаях, когда точно известно, что класс должен что-то делать, но неизвестно, как он должен это делать.
Модификаторы доступа в классы
Принцип инкапсуляции предписывает скрывать как можно больше ненужной для использования из вне информации используя модификаторы доступа.
Их 3:
1. Private - модификатор доступа, дающий доступ к полям и методам класса только для других методов этого же класса. Приватный уровень доступа считается самым низким, т.к. дает дает доступ к минимальному количеству программных конструкций
|
|
2. Protected - модификатор доступа, дающий доступ для методов текущего класса и всех его наследников(средний уровень доступа)
3. Public - модификатор доступа, дающий доступ для любого метода или любой функции в программе без ограничений.
Если модификатор доступа не указан, то поле или метод автоматически становится приватным
Описание класса
Описание класса приблизительно выглядит так:
class <имя> {
[private:]
<описание скрытых элементов>
protected:
<описание защищенных элементов>
public:
<описание доступных элементов>
}; // описание заканчивается точкой с запятой обязательно!!!
Модификаторы доступа могут быть назначены как свойствами класса, так и методами. В практике программирования принято свойства класса делать приватными, а методы класса - публичными. Такое ограничение связано с тем, что метод класса в состоянии проверить и не допустить некорректного использования данных.
Виды классов
Классы бывают:
– глобальные (объявленные вне любого блока);
– локальные (объявленные внутри блока, например, функции или
другого класса).
Свойства полей класса
Поля класса:
– могут иметь любой тип, кроме типа этого же класса, но могут быть указателями или ссылками на этот класс (данное утверждение только для С++);
|
|
– могут быть описаны с модификатором const в том случаи, если поле представляет собой константу, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;
class test
{
private:
const double pi = 3,14;
}
class test
{
private:
const double pi = 3,14;
void modify ( )
{
pi = 5; // error
}
} // приведет к ошибке
– могут быть описаны с модификатором static, но не с auto, extern и register.
Инициализация полей при описании не допускается, так как память под класс не выделяется, пока не будет создан экземпляр класса
ООП и раздельная компиляция поля
В практике программирования на С++ принято разделять декларативную и функциональную часть программного кода. Именно поэтому описание любого класса физически находится в 2-х файлах:
1. Файл с расширением «.h» содержит декларативную часть;
2. Файл с расширением «.cpp» содержит функциональную часть.
Оба файла должны иметь одно и то же имя.
При использовании класса программист подключает декларативную часть как и обычную библиотеку, функциональная — подключается автоматически.
Единственное отличие при подключении класса заключается в использовании « » вместо < >.
Данный механизм называется раздельной компиляцией кода.
Пример:(Вычисляем S круга)
// a.h
class test
{
private:
const double pi = 3,14;
public:
double getArea (double radius);
}
// a.cpp
double test : : getArea (double radius);
{
return radius *radius*pi;
}
// main.cpp
#include <stdlib.h>
#include «a.h»
int main ( )
{
test t; double rad;
scanf («%f», s rad);
var area = t.getArea (rad);
printf («%5,2f», area);
}
Создание объектов
Создание объекта в зависимости от места его расположения в памяти компьютера бывают двух видов:
- статическое;
- динамическое.
Соответственно, статические объекты располагаются в статической памяти, а динамически - в куче (динамической памяти).
Создание статических объектов имеет определенные ограничения, связанные с ограничением объема статической памяти программы.
В современных языках программирования объекты в основном принято располагать в динамической памяти (куче), которая имеет объем до 80-ти% от общего объема памяти, выделяемого программе.
point p - создание объекта с статистической памяти;
point * p 3 = new point (10) - создание объекта в динамической памяти.
Создание объектов в динамической памяти состоит из 2-х этапов:
1. Объявление указателя на объект с статистической памяти;
2. Создание объекта в куче и присвоение указателя на него.
Создание объектов в динамической памяти происходит при помощи конструкции new, которая выступает аналогом malloc из языка Си.
При всем этом, new является более производительной и легкой в исполнении, т.к. не требует вычисления необходимого для создания объекта объема памяти.
По способу конструирования объекта выделяют 3 способа создания объекта:
1) создание объектов с инициализацией по умолчанию;
2) создание объектов со специальной инициализацией;
3) создание объектов путем копирования других объектов.
1. point p;
point *p = new Point;
point *p = new Point ( );
2. point p (20,20);
point *p = new Point (20,20);
Количество параметров в данном способе зависит от способов конструирования объектов, поддерживаемых классом.
3. В данном способе, объект получает те же самые характеристики которые имеет прототип. Прототип - объект, взятый за образец для создания.
point *sp4 = p1
Удаление объектов
Объекты создаются в статистической памяти в удалении не нуждаются. Однако, объекты, создаваемые в динамической памяти, при помощи new требуют удаления. Если его не выполнить, то отведенная область памяти будет считаться зарезервированной за данным приложением и не освободится даже после его закрытия. Такая ситуация называется утечкой памяти.
Для удаления используется конструкция delete . Она принимает указатель на область памяти, которую необходимо очистить.
point *p = new Point (10,10);
p = NULL;
delete = p;
Getter и Setter
В практике программирования приходится очень часто манипулировать значениями свойств, объявленными в классе, при этом из соображений безопасности эти свойства объявляются приватными. Для корректности работы с ними, чтения и записи, программист должен разработать специальные методы называемые getter и setter .
Чаще всего эти имена соответствуют имени получаемого или записываемого свойства с добавлением префикса get и set .
Setter содержит проверки на корректность допустимого значения.
class Student
{
private:
char *Name;
double avg_ball;
public:
Char* get_Name ( )
{
return Name;
}
void setName (char *_Name)
{
if (strlen (_Name) == 0)
printf («Error»);
else strcpy (_Name, Name)
}
double getAvgBall( )
{
return avg_ball;
}
void setAvgBall (double, new_ball)
{
if (newBall < 2)
printf («Error»);
else
avg_ball = newBall;
}
Указатель this
В указателе находится адрес объекта (№ ячейки памяти в которой находится объект). Указатель this - указатель на ссылку текущего экземпляра класса. Иногда используется, чтобы передать ссылку объекта в другой класс. delete this - ошибка, т.к. объект сам себя удалять не может.
Указатель this - указатель на текущий объект класса, который может использоваться в методах этого класса. В основном, this используется для решения конфликтных ситуаций, возникающих при именовании переменных и свойств, для возврата во внешний объект ссылки на текущий (для организации внешнего управления объектом).
Правилом хорошего тона считается использовать this всякий раз, когда идет обращение к методам и свойствам класса внутри этого класса.
class Student
{
private:
double newBall;
public:
void setAvgBall(double newBall)
{
if (newBall < 2);
printf («Error»);
else
this -> _newBall = newBall;
}
}
// конфликтная ситуация связанная с именованием элементов
Пример. Удаление/отчисление студента
class Student
{
private:
double newBall;
public:
Student* getLink( )
{
if (this -> newBall < 25)
return this;
else
return null;
}
}
class Faculty
{
private:
Student [ ] st;
int count;
public:
void Otchislenie( )
{
for (int i = 0 ; i<this -> count; i++)
{
Student* st1 = this ->st[i];
if (st1 != null)
delete st1;
}
}
}
Дата добавления: 2019-09-13; просмотров: 195; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!