Друкарня від WE.UA

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

Що це?

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

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

Статті про вітчизняний бізнес та цікавих людей:

  • Шлейф сучасного смартфону та його призначення

    Шлейф - це тонка пластикова стрічка з ледь видимими доріжками і саме вона зʼєднує важливі компоненти мобільного, без яких він не запрацює. Власники пристроїв Xiaomi, які стикаються з потребою заміни цієї деталі, можуть підібрати відповідний варіант на сайті AKS.UA

    Теми цього довгочиту:

    Шлейф Для Мобільного
  • Чохли для iPhone 15: повний гід по кольорах, матеріалах і виробниках

    Перед тим як вибрати чохли для iPhone 15, варто визначитися, що саме ви хочете отримати від аксесуара. Комусь потрібен тонкий прозорий корпус, інший покупець шукає посилений захист, а для когось вирішальним стане колір або підтримка MagSafe

    Теми цього довгочиту:

    Чохли Для Iphone
  • Як побудована програма Meest China Academy

    Курс про товарний бізнес охоплює різні етапи роботи: від пошуку ідеї до перевірки товару, логістики та масштабування. Програма Meest China Academy містить 17 модулів, які послідовно розкривають ці теми без зведення всього навчання до однієї універсальної поради.

    Теми цього довгочиту:

    Meest
  • Які технології використані в Айфон 17

    Айфон 17 поєднує OLED-дисплей із частотою до 120 Гц, чип A19, дві камери Fusion 48 Мп і швидке заряджання через USB-C. У COMFY можна купити Айфон 17 з накопичувачем на 256 або 512 ГБ, вибравши конфігурацію відповідно до обсягу фото, відео та застосунків

    Теми цього довгочиту:

    Iphone 17
  • Як вибрати вживаний iPhone: коротке керівництво для розумної покупки

    Вторинний ринок смартфонів Apple активно зростає, і питання, як вибрати вживаний iPhone, стає актуальним для дедалі більшої кількості користувачів. Правильний підхід дозволяє отримати бу iPhone з актуальною iOS і доброю камерою за помітно нижчу ціну, ніж у нових пристроїв.

    Теми цього довгочиту:

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

21Довгочити
9.2KПерегляди
25Підписники
На Друкарні з 3 травня 2023

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

Це також може зацікавити:

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

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

Це також може зацікавити: