Классы в C++ лучше объяснять не через абстрактную "модель мира", а через обычную задачу. Есть товар: название, цена, скидка. Хочется хранить данные товара и действия с ним рядом
Для этого подходит класс
- Первый класс
- public и private
- Constructor
- Полный пример
- Зачем это нужно
- Наследование очень коротко
- Частые ошибки
- Забыли точку с запятой после класса
- Все сделали public
- Класс ради класса
- Копирование в цикле
- Мини-задание
- Ответы на эти вопросы могут быть для вас полезными
- Что такое класс в C++?
- Чем class отличается от struct?
- Что такое constructor?
- Зачем private?
- Когда учить наследование?
- Что почитать дальше по 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, в struct — public. В остальном они близки, но используются с разными стилевыми ожиданиями
Что такое constructor?
Это специальный метод, который вызывается при создании объекта
Зачем private?
Чтобы защитить внутренние данные объекта и управлять изменениями через методы
Когда учить наследование?
После того, как понятны простые классы, методы, конструкторы и ссылки. Наследование лучше не тащить в первый урок
Что почитать дальше по C++
Чтобы тема складывалась в понятный маршрут, рядом лучше открыть:
- Функции в C++: как убрать повтор кода — сначала закрепить обычные функции и return.
- Типы данных в C++: int, double, bool, char, string — понять, из каких полей состоит объект.
- Указатели в C++ без паники — подготовиться к объектам, адресам и ссылкам.
- Сортировки на C++: пузырек и быстрая сортировка — увидеть, как алгоритмы живут рядом с объектной моделью.



