ООП в С++: розбір принципів та їх застосування в практиці

Що це?

Об'єктно-орієнтоване програмування (ООП) є ключовим підходом до розробки програмного забезпечення. Мова програмування С++ є однією з найбільш популярних мов програмування, яка підтримує ООП. У цій статті ми розглянемо основні принципи ООП в С++ та надамо приклади коду.

Класи і об'єкти Класи є основою ООП в С++. Класи описують властивості та поведінку об'єктів. Об'єкти є екземплярами класів і представляють конкретні елементи, які можуть взаємодіяти з іншими об'єктами. Для оголошення класу використовують ключове слово "class", а для оголошення об'єкта - ім'я класу, за яким слідує назва об'єкта у дужках.

Приклад оголошення класу і об'єкта в С++:

// Оголошення класу "Person"
class Person {
public:
  std::string name;
  int age;
};

// Оголошення об'єкта "person1" класу "Person"
Person person1;
person1.name = "John";
person1.age = 30;

Інкапсуляція

Інкапсуляція - це принцип ООП, який дозволяє приховувати внутрішню реалізацію об'єкта від зовнішнього світу. Це забезпечує високий рівень захисту даних і сприяє зручності управління об'єктами. В С++ інкапсуляцію можна досягти за допомогою модифікаторів доступу, таких як "public", "private" та "protected".

Приклад використання інкапсуляції в С++:

class BankAccount {
private:
  std::string accountNumber;
  double balance;
public:
  // Конструктор з параметрами
  BankAccount(std::string accNum, double initBalance) {
    accountNumber = accNum;
    balance = initBalance;
  }
  // Метод, що змінює баланс рахунку
  void deposit(double amount) {
    balance += amount;
  }
  // Метод, що повертає баланс рахунку
  double getBalance() {
    return balance;
  }
};

int main() {
  // Створюємо об'єкти класу BankAccount з різними параметрами
  BankAccount acc1("12345", 1000);
  BankAccount acc2("67890", 500);

  // Використовуємо метод deposit() для зміни балансу обох рахунків
  acc1.deposit(500);
  acc2.deposit(1000);

  // Виводимо на екран баланси обох рахунків
  std::cout << "Баланс рахунку " << acc1.getAccNumber() << ": " << acc1.getBalance() << std::endl;
  std::cout << "Баланс рахунку " << acc2.getAccNumber() << ": " << acc2.getBalance() << std::endl;

  return 0;
}

В цьому прикладі, ми використали модифікатори доступу "private" та "public", щоб приховати змінну accountNumber від зовнішнього світу, а також дозволити доступ до методів deposit та getBalance.

Спадкування

Спадкування - це принцип ООП, який дозволяє створювати новий клас на основі вже існуючого класу, утримуючи властивості та методи попереднього класу. У С++ спадкування реалізується за допомогою ключового слова "public" або "private", яке вказує рівень доступу до властивостей та методів базового класу в похідному класі.

Приклад використання спадкування в С++:

// Базовий клас
class Animal {
public:
  void eat() {
    std::cout << "Animal is eating\n";
  }
};

// Похідний клас
class Dog : public Animal {
public:
  void bark() {
    std::cout << "Woof!\n";
  }
};

int main() {
  // Створення об'єкта похідного класу
  Dog dog;
  // Виклик методу базового класу з похідного класу
  dog.eat();
  // Виклик методу похідного класу
  dog.bark();
}

У цьому прикладі ми створили базовий клас "Animal", який має метод "eat". Потім ми створили похідний клас "Dog", який спадкує метод "eat" з базового класу і має свій власний метод "bark". На останок ми створили об'єкт похідного класу "Dog" та викликали методи "eat" та "bark".

Поліморфізм

Поліморфізм - це принцип ООП, який дозволяє об'єктам одного класу виконувати різні дії, залежно від контексту, у якому вони використовуються. У С++ поліморфізм можна досягти за допомогою віртуальних функцій.

Приклад використання поліморфізму в С++:

// Базовий клас
class Shape {
public:
  // Віртуальний метод
  virtual double getArea() = 0;
};

// Похідний клас Rectangle
class Rectangle : public Shape {
private:
  double width;
  double height;
public:
  Rectangle(double w, double h) : width(w), height(h) {}

  // Реалізація віртуального методу
  double getArea() override {
    return width * height;
  }
};

int main() {
  Rectangle r1(3, 4);
  Rectangle r2(5, 6);

  Shape* shapes[2];
  shapes[0] = &r1;
  shapes[1] = &r2;

  for (int i = 0; i < 2; i++) {
    std::cout << "Shape " << i << " has area " << shapes[i]->getArea() << std::endl;
  }

  return 0;
}

У цьому прикладі ми створили базовий клас "Shape", який має віртуальний метод "getArea". Потім ми створили два похідних класи - "Rectangle" та "Circle", які перевизначають метод "getArea" з базового класу. На останок ми створили масив об'єктів базового класу "Shape", які можуть бути або "Rectangle", або "Circle". Під час виклику методу "getArea" для кожного об'єкту, С++ автоматично визначає, який саме метод потрібно викликати - той, який визначений в базовому класі, або той, який перевизначений в похідному класі.

Висновок

У цій статті ми розглянули основні принципи ООП в мові програмування С++, такі як інкапсуляція, спадкування та поліморфізм. Ми також навели приклади коду, щоб краще проілюструвати ці принципи. Нехай ця стаття допоможе вам краще зрозуміти ООП та зробить вас кращим програмістом.

https://t.me/r4w3ss

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Rodj
Rodj@Rodj

6.5KПрочитань
5Автори
24Читачі
На Друкарні з 3 травня

Більше від автора

Вам також сподобається

Коментарі (2)

Дякую за статтю. Проте зроблю декілька зауважень. Інкапсуляція це все ж таки не тільки про захист стану об'єкта від зовнішнього втручання, це ще й про саме поняття "об'єкта" та "класу". Особисто я даю таке визначення інкапсуляції — парадигма ООП, яка дозволяє об'єднувати дані та функції їх обробки у одну єдину сутність — клас, а також захищати їх від зовнішнього втручання за допомогою модифікаторів доступу: public, protected, private. Стосовно спадкування, ви сказали, що спадкування буває тільки public та private, проте ще є protected. Пояснення поліморфізму мені здалось трохи заплутаним, чому саме "об'єкти одного класу"? На мою думку у вашому формулюванні краще сказати "покажчики на об'єкти одного класу". У наведеному прикладі коду немає класу Circle, проте нижче ви пишете щось про нього. "На останок ми створили масив об'єктів базового класу "Shape"" — не масив об'єктів, а масив покажчиків на об'єкти, тому що фактично створити об'єкт вашого класу Shape не можна, адже це абстрактний клас (містить чисто віртуальну функцію-член). Ну і ще, ви розповіли про динамічний поліморфізм — поліморфізм підтипів, але не сказали про це, також не сказали про інші види статичного поліморфізму — ad-hoc та параметричний (перевантаження функцій та шаблони). Ваше визначення поліморфізму не є універсальним, адже воно не описує види статичного поліморфізму. Я даю таке узагальнене визначення поліморфізму — ідея ООП, яка дозволяє отримувати різну реалізацію коду по одному і тому самому інтерфейсу.

Вам також сподобається