У цій публікації блогу ми розглянемо, чим об'єктно-орієнтоване програмування відрізняється від процедурного програмування, і дослідимо, як ця концепція реалізована в C++.
На зорі програмування, невдовзі після розробки комп'ютерів, процедурне програмування було основною концепцією. Процедурне програмування — це концепція виконання коду, введеного користувачем, у заздалегідь визначеній послідовності. З плином часу, коли код ставав дедалі складнішим і важчим для розуміння, виникла концепція об'єктно-орієнтованого програмування. На відміну від процедурного програмування, об'єктно-орієнтоване програмування передбачає створення кількох невеликих одиниць, які називаються об'єктами, та їх об'єднання для виконання програми. C++ виник шляхом інтеграції цієї концепції об'єктно-орієнтованого програмування в існуючу процедурну мову C.
Хоча окрім C++ існують різні інші об'єктно-орієнтовані мови програмування, спосіб реалізації об'єктно-орієнтованих концепцій у них відрізняється. C++ реалізує об'єктно-орієнтоване програмування за допомогою концепції «Клас». У C++, використовуючи змінну, потрібно явно вказати комп'ютеру, якого типу ця змінна. Наприклад, використовуючи змінну з іменем «a», потрібно чітко вказати, чи є «a» цілим числом, числом з плаваючою комою тощо. Клас — це не базовий тип, як ціле число чи число з плаваючою комою; це тип, щойно визначений програмістом. У межах користувацького класу можна створювати різні змінні та функції. Наприклад, якщо створити клас з іменем «тварина», можна визначити всередині нього змінну з плаваючою комою «вага» для представлення ваги, а також можна визначити функцію для відтворення звуків. Клас лише забезпечує структуру; фактичне використання можливе шляхом створення змінних типу класу «тварина». Цю концепцію часто порівнюють з формою для хліба та хлібом. Ви створюєте форму для хліба, яка називається класом, а потім використовуєте цю форму для формування змінних, таких як хліб. Змінні, створені за допомогою класу, називаються «об'єктами».
Основні компоненти об'єктно-орієнтованих концепцій загалом поділяються на успадкування, інкапсуляцію та поліморфізм. C++ реалізує ці елементи всередині класів. Успадкування – це концепція, коли один клас успадковує функціональність від іншого класу. Наприклад, припустимо, що є клас «тварина» та класи «лев» і «кролик». Оскільки леви та кролики – це тварини, добре розроблена програма мала б класи «лев» і «кролик», які успадковують більшу частину функціональності від класу «тварина». Це дозволяє створювати лаконічний код, просто вказуючи, що «лев» і «кролик» успадковуються від класу «тварина», без переписування того самого коду. Тут клас «тварина», який забезпечує успадкування, називається батьківським класом, тоді як класи «лев» і «кролик», які отримують успадкування, називаються дочірніми класами.
Інкапсуляція контролює доступ до внутрішньої інформації класу. Якщо важливі дані зберігаються в класі, дозвіл на невибірковий доступ до них є ризикованим. Однак не можна зробити весь клас приватним лише для захисту певних даних. Тому ключові слова використовуються для розрізнення того, яка інформація є відкритою, а яка прихованою.
Поліморфізм означає, що одне й те саме ім'я може поводитися по-різному залежно від контексту. У C++, під час визначення функції, необхідно явно вказати ім'я функції, тип повернення, а також типи та кількість змінних, що передаються функції. Наприклад, під час створення функції для додавання двох чисел, функція, яка додає цілі числа, і функція, яка додає числа з плаваючою комою, виконують різні дії. Однак, навіть якщо це схожі функції, якщо їм потрібно дати різні імена, запам'ятовування та використання стає дуже громіздким. Однак у C++, якщо тип повернення, типи вхідних змінних або кількість змінних відрізняються, функції з однаковим ім'ям розпізнаються як різні. Крім того, дочірньому класу не потрібно повторювати всю функціональність свого батьківського класу. Наприклад, якщо є функція, яка видає звук тварини, оскільки кожна тварина видає різний звук, дочірній клас може перевизначити (перевизначити) цю функцію, щоб вона використовувала власну версію.
C++ — це мова програмування, створена шляхом додавання додаткового синтаксису до C, завдяки чому вона може використовувати більшість можливостей C. Тому вказівники, одна з ключових можливостей C, також використовуються безпосередньо в C++. Кожна область пам'яті комп'ютера має унікальну адресу. Вказівник служить для вказівки на цю адресу. Коли функції потрібно отримати змінну для виконання, комп'ютер копіює цю змінну, зберігає її в новому просторі, а потім виконує функцію, використовуючи цю змінну. Після завершення виконання функції скопійована змінна зникає. Наприклад, під час виконання функції «swap», яка обмінює значення двох змінних, значення скопійованої змінної змінюється, але початкова змінна залишається незмінною. Однак, якщо функція «swap» отримує вказівник на змінну та змінює її значення, вказівник вказує на унікальну адресу, тому значення змінної фактично змінюється. C++ також надає функцію посилання, яка передає саму змінну замість вказівника, що робить її корисною.
Ще однією ключовою особливістю є підтримка узагальненого програмування. Узагальнене програмування – це концепція, розроблена для покращення можливості повторного використання коду та зручності програміста. Основною функцією C++ для досягнення цієї мети є шаблони. Як згадувалося раніше, хоча можна створити кілька функцій з однаковим ім'ям, створення кількох простих функцій додавання є марнотратством. Використовуючи шаблони, комп'ютер автоматично визначає тип (цілочисельний чи число з плаваючою комою), який отримує функція, і виконує операцію відповідно. Це скорочує час написання коду, робить код більш лаконічним та покращує читабельність.
Ще одним елементом генеричного програмування є STL (Стандартна бібліотека шаблонів). Використання даних має вирішальне значення в програмуванні. Алгоритми обробки даних математично організовані, а структури даних є їх реалізаціями. Однак, програмісти, які щоразу відтворюють структури даних з нуля, не тільки забирають багато часу, але й не гарантують, що алгоритм оптимізований. C++ надає оптимізовані експертами структури даних на рівні мови, яким є STL. Програмісти просто вибирають і використовують потрібну структуру даних.
Таким чином, C++ надає багато можливостей на рівні мови для зручності користувача. Оскільки вона була створена як розширення C, сама мова має складні аспекти. Вивчення та розуміння всіх цих концепцій може бути складним завданням, але завдяки потужним можливостям C++ багато програмістів досі використовують його. Стандарт синтаксису C++ продовжує розвиватися з часом, і в майбутньому будуть додаватися різні функції для зручності програмістів.