Классы и ООП в C++: первый пример без перегруза

Классы в C++ лучше объяснять не через абстрактную "модель мира", а через обычную задачу. Есть товар: название, цена, скидка. Хочется хранить данные товара и действия с ним рядом

Для этого подходит класс

Первый класс

#include <iostream>
#include <string>

class Product {
public:
    std::string title;
    double price;
    double discount;

    double getFinalPrice() {
        return price - (price * discount / 100);
    }
};

int main() {
    Product course;
    course.title = "Курс по C++";
    course.price = 7900;
    course.discount = 10;

    std::cout << course.title << std::endl;
    std::cout << course.getFinalPrice() << std::endl;

    return 0;
}

У класса есть поля:

  • title;
  • price;
  • discount.

И метод:

  • getFinalPrice.

Метод — функция внутри класса

public и private

В примере все поля public, то есть доступны снаружи. Для первого знакомства это просто, но в настоящем коде поля часто делают private, а доступ дают через методы

class Product {
private:
    std::string title;
    double price;
    double discount;

public:
    void setData(std::string newTitle, double newPrice, double newDiscount) {
        title = newTitle;
        price = newPrice;
        discount = newDiscount;
    }

    double getFinalPrice() {
        return price - (price * discount / 100);
    }

    void print() {
        std::cout << title << ": " << getFinalPrice() << std::endl;
    }
};

private защищает внутреннее состояние от случайных изменений

Constructor

Чтобы не вызывать setData, можно сделать конструктор:

class Product {
private:
    std::string title;
    double price;
    double discount;

public:
    Product(std::string productTitle, double productPrice, double productDiscount) {
        title = productTitle;
        price = productPrice;
        discount = productDiscount;
    }

    double getFinalPrice() {
        return price - (price * discount / 100);
    }

    void print() {
        std::cout << title << ": " << getFinalPrice() << std::endl;
    }
};

Создание:

Product course("Курс по C++", 7900, 10);
course.print();

Конструктор вызывается при создании объекта

Полный пример

#include <iostream>
#include <string>
#include <vector>

class Product {
private:
    std::string title;
    double price;
    double discount;

public:
    Product(std::string productTitle, double productPrice, double productDiscount) {
        title = productTitle;
        price = productPrice;
        discount = productDiscount;
    }

    double getFinalPrice() {
        return price - (price * discount / 100);
    }

    void print() {
        std::cout << title << ": " << getFinalPrice() << " руб." << std::endl;
    }
};

int main() {
    std::vector<Product> products = {
        Product("Курс по C++", 7900, 10),
        Product("Шаблон сайта", 3900, 0),
        Product("Консультация", 4500, 15)
    };

    for (Product product : products) {
        product.print();
    }

    return 0;
}

Теперь у нас есть несколько товаров, и каждый умеет сам считать свою итоговую цену

Зачем это нужно

Класс полезен, когда у сущности есть:

  • данные;
  • действия с этими данными;
  • правила, которые хочется держать рядом.

Для простого сложения двух чисел класс не нужен. Для товара, пользователя, заказа, задачи, игрового персонажа — уже может быть полезен

Наследование очень коротко

Класс может расширять другой класс:

class DigitalProduct : public Product {
    // дополнительные поля и методы
};

Но новичку не стоит начинать с наследования. Сначала поля, методы, конструктор, public/private. Потом уже наследование, виртуальные методы и переопределение

Частые ошибки

Забыли точку с запятой после класса

class Product {
};

После закрывающей скобки класса нужна ;

Все сделали public

Для учебного примера можно. В серьезном коде внутренние поля часто делают private

Класс ради класса

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

Копирование в цикле

for (Product product : products) {
    product.print();
}

Для больших объектов лучше:

for (const Product& product : products) {
    product.print();
}

Тогда объект не копируется

Мини-задание

Создай класс Student:

  • имя;
  • оценка;
  • метод isPassed;
  • метод print.

Пример:

class Student {
private:
    std::string name;
    int score;

public:
    Student(std::string studentName, int studentScore) {
        name = studentName;
        score = studentScore;
    }

    bool isPassed() {
        return score >= 60;
    }
};

Ответы на эти вопросы могут быть для вас полезными

Что такое класс в C++?

Это шаблон для объектов, который объединяет данные и методы

Чем class отличается от struct?

В class по умолчанию доступ private, в structpublic. В остальном они близки, но используются с разными стилевыми ожиданиями

Что такое constructor?

Это специальный метод, который вызывается при создании объекта

Зачем private?

Чтобы защитить внутренние данные объекта и управлять изменениями через методы

Когда учить наследование?

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

Что почитать дальше по C++

Чтобы тема складывалась в понятный маршрут, рядом лучше открыть:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x