ООП и раздельная компиляция поля



ПАРАДИГМЫ ПРОГРАММИРОВНИЯ

Парадигма программирования - это совокупность идей и понятий, определяющих стиль написания программ.

Не определяется однозначно языком программирования. Практически все современные языки программирования в той или иной мере допускают использование различных парадигм.

Существуют основные модели (виды) программирования:

- функциональное программирование - это способ программирования, основанный на использовании под программ (функций и процедур)

- структурное программирование - это способ программирования, основанный на представлении программы в виде иерархической структуры блоков

- декларативное программирование - это способ программирования, в котором описывается, что представляет собой проблема и что должно получиться в результате

- императивное программирование - это способ программирования, в котором программа состоит из набора инструкций, выполняемых последовательно

- логическое программирование - это способ программирования, основанный на автоматическом доказательстве теорем

- объектно-ориентированное программирование

Объектно-ориентированное программирование бывает:

- основанное на классах;

- основанное на прототипах;

- основанное на субъектах.

Объектно-ориентированное программирование, основанное на прототипах - это парадигма, которая позволяет переопределять и добавлять новые функции уже существующим объектам посредствам создания прототипов.

Прототип - это функция, которая может быть привязана к определенному объекту.

- субъектно-ориентированное программирование - это способ программирования, основанный на построении ООП-систем, как композиции субъектов.

Объектно-ориентированное программирование основанное на классах

 

Ключевыми понятиями ООП, основанного на классах, является класс и объект. Класс - это программная единица, представляющая собой совокупность характеристик какой-либо сущности и действий, которые эта сущность может выполнять.

Характеристики называются свойствами, действия - методами, сущность - объектом.

Фактически, класс - тип данных, определяемый пользователем и описывающий сущность.

Объект - это переменная типа «класс» или экземпляр «класса»

 

 

 


Свойства объектно-ориентированного программирования

Принято считать, что ООП рядом свойств:

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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!