Основы ООП. Различия функциональной и объектной декомпозиции. Мотивация введения ООП. Понятия класса и объекта.

Декомпозиция: Научный метод, использующий структуру задачи и позволяющий заменить решение одной большой задачи решением серии меньших задач.

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

ООП возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны.

Класс – это производный тип, введенный программистом на основе уже существующих типов. Механизм классов позволяет создавать типы, с наибольшей полнотой отображающие особенности решаемой задачи. Класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными.

Объект - это конкретный экземпляр класса, располагающийся в памяти компьютера.

13. Основы ООП. Сравнение класса и структуры в С++. Модификаторыдоступаprivate, protected, public. Примеры.

Структура Класс
structbooks { intnomer; string name; string author; int page; int cost; books* next; }; class books { public: intnomer; string name; string author; int page; intcost; books* next; };

Модификатор доступа public (открытый): К членам класса (функциям и данным), объявленным с модификатором public можно получить доступ из любого места программы.

Модификатор доступа private (закрытый): К членам класса (функциям и данным), объявленным с модификатором private можно получить доступ только из функций самого класса (а также из функций и классов друзей).

Модификатор доступа protected (защищенный): К членам класса (функциям и данным), объявленным с модификатором protected можно получить доступ только из функций самого класса, из функций потомков класса, (а также из функций‐друзей и классов‐ друзей).

Наследование – это использование ранее определенного класса. Язык С++ позволяет классу наследовать данные и функции члены одного или нескольких других классов. Другими словами, новый класс может получать атрибуты и поведение от уже существующего класса. Новый класс называют производным классом. Класс, элементы которого наследуются производным классом, называется базовым классом.

14. Основы ООП. Понятие инкапсуляции. Способы ее реализации в С++. Перегрузка операторов.

Инкапсуляция:
• Свойство языка программирования, позволяющее объединить и защитить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта.
• Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected.
• Пользователь не может влиять на работу объекта, кроме как через интерфейс. Реализуется с помощью использования закрытых данных и методов, значения которых берутся из открытого
интерфейса при создании объекта.

Примеринкапсуляции:

class Student

{

public:

voidsetName(constchar* name)

{

if (name != NULL &&strlen(name) < 80)

{

strcpy(_name, name);

}

}

constchar* getName()

{

return _name;

}

private:

char _name[80];

};

Пример использования класса:

Student s;

s.setName("Вася");

Перегрузка функций: Перегрузка (англ. «overloading») – возможность использования функций, имеющих одинаковые имена, но отличающихся друг от друга списком параметров (количеством и /или типом параметров).

Перегрузка операторов:
• Иногда возникает потребность описывать и применять к созданным программистом типам данных операции, по смыслу эквивалентные уже имеющимся в языке.
• Классический пример — библиотека для работы с комплексными числами. Они, как и обычные числовые типы, поддерживают арифметические операции, и естественным было бы создать для
данного типа операции «плюс», «минус», «умножить», «разделить», обозначив их теми же самыми знаками операций, что и для других числовых типов.

Перегрузка оператора присваивания:

Для класса Т1 оператор присваивания из типа Т2, являющийся членом класса, может иметь следующий вид.
Передача параметра по ссылке: T1&operator=(T2&source);
Передача параметра по значению: T1&operator=(T2 source);

Пример:

ClassMyInt

{

public:

MyInt&operator=(MyInt& source)

{

_value = source._value;

Return*this;

}

MyInt&operator=(int value)

{

_value = value;

Return*this;

}

private:

int _value;

};

MyInt a, b;

b = 25;

a = b;

15. Основы ООП. Конструкторы и деструкторы. Определения, примеры реализации. Перегрузка конструкторов.

Инициализация и де‐инициализация
• Для инициализации объекта класса используется специальная функция «конструктор класса»
• Для де‐инициализации класса используется специальная функция «деструктор класса»

Конструктор класса
• Функция - конструктор класса вызывается автоматически в момент создания экземпляра класса (объекта).
• Конструктор является хорошим местом для инициализации объекта.
• Имя функции конструктора должно совпадать с именем класса.
• Функция‐конструктор ничего не возвращает (даже void).

Деструктор класса
• Функция ‐ деструктор класса вызывается автоматически в момент перед разрушением экземпляра класса (объекта).
• Деструктор является хорошим местом для освобождения выделенных ресурсов (например, выделенной памяти).
• Имя функции деструктора должно начинаться с символа «тильда» ~, а в остальном совпадать с именем класса.
• Функция‐деструктор ничего не возвращает (даже void).

Пример конструктора и его перегрузки:

classbooks

{

public:

intnomer;

string name;

string author;

int page;

int cost;

books* next;

books()

{

nomer = 0;

name = "";

author = "";

page = 0;

cost = 0;

};

books(string name1, string author1, int page1, int cost1)

{

name = name1;

author = author1;

page = page1;

cost = cost1;

};

~books() {};

};

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

class list

{

private:

books* start;

books* current;

books* tmp;

public:

list();

~list();

};

list::list()

{

start = NULL;

current = NULL;

tmp = NULL;

}

list::~list()

{

if (start != NULL)

{

while (start != NULL)

{

tmp = start->next;

delete start;

start = tmp;

}

}

if (tmp != NULL)

deletetmp;

}

16. Основы ООП. Решение задачи создания списочной структуры средствами ООП (задача о списке студентов).

class Student

{

public:

Student() // Конструктор

{

_id = 0;

_name = _T("");

_avgMark = 0;

}

~Student() {} // Деструктор

voidSetId(intn) // Записать "Номер"

{

if (n> 0)

_id = n;

}

intGetId() // Прочитать "Номер"

{

return _id;

}

voidSetName(string name) //ЗаписатьИмя

{

_name = name;

}

stringGetName() //ПрочитатьИмя

{

return _name;

}

voidSetMark(float n) // Записатьоценку

{

if (n > 0)

_avgMark = n;

}

floatGetMark() // Прочитатьоценку

{

return _avgMark;

}

void Print()

{

cout<< _id <<". "<< _name;

cout<<" ("<< _avgMark<<")"<<endl;

}

private:

int _id; //Номер

string _name; //Имя

float _avgMark; //Оценка

};

int _tmain(int argc, _TCHAR* argv[])

{

Student s1;

cout<<"Созданные элементы:\n";

s1.Print();

s1.SetId(1);

s1.SetName("Иван Петров");

s1.SetMark(75);

cout<<"\n\nЗаполненные элементы:\n";

s1.Print();

return 0;

}


Наши рекомендации