Классы и объекты в C++: практическое руководство с примерами кода
Что такое класс?
Класс в C++ — пользовательский тип данных, объединяющий данные и функции, работающие с этими данными, в единую сущность. Представьте его как чертеж: он описывает структуру и поведение объектов, которые могут быть созданы на его основе.
Как чертеж дома определяет размещение дверей, окон и комнат, класс описывает расположение своих членов-данных и операций для их манипуляции. Из одного чертежа можно построить множество домов (объектов) с разными характеристиками.

На иллюстрации один прототип производит два различных дома с разными свойствами.
В этом уроке вы узнаете:
- Что такое класс и почему он важен в C++
- Конкретные примеры классов
- Роль модификаторов доступа
privateиpublic - Как создавать объекты (инстанцирование)
- Безопасный доступ к членам-данным
- Функции-члены внутри и вне определения класса
- Конструкторы и деструкторы в действии
Объявление класса
Объявление класса простое: используйте ключевое слово class, имя класса и заключите тело в фигурные скобки.
Синтаксис
class className {
// члены-данные
// функции-члены
};
- className — идентификатор вашего класса.
- Члены-данные обычно объявляются как переменные.
- Функции-члены предоставляют поведение.
Модификаторы доступа: private vs public
Модификаторы доступа контролируют видимость членов класса.
- private — члены доступны только внутри класса или его друзей (friends).
- public — члены доступны отовсюду, где виден объект.
Создание объектов (инстанцирование)
Объекты — экземпляры класса. Объявление объекта аналогично объявлению переменной: className objectName;
Синтаксис
className objectName;
- className — класс, из которого создаётся объект.
- objectName — идентификатор нового объекта.
Инстанцирование выделяет память под объект и может вызвать его конструктор.
Доступ к членам-данным
Публичные члены-данные доступны через оператор точка (.).
Пример: Публичные члены
#include <iostream>
using namespace std;
class Phone {
public:
double cost;
int slots;
};
int main() {
Phone Y6;
Phone Y7;
Y6.cost = 100.0;
Y6.slots = 2;
Y7.cost = 200.0;
Y7.slots = 2;
cout << "Cost of Huawei Y6 : " << Y6.cost << endl;
cout << "Cost of Huawei Y7 : " << Y7.cost << endl;
cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl;
cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl;
return 0;
}
Вывод:

Зачем нужны геттеры/сеттеры?
Прямой доступ к данным может нарушить инкапсуляцию. Использование геттеров и сеттеров> (функций-членов для чтения/записи) даёт контролируемый доступ.
Пример с инкапсуляцией
#include <iostream>
using namespace std;
class ClassA {
public:
void setA(int val);
int getA() const;
private:
int a;
};
int ClassA::getA() const {
return a;
}
void ClassA::setA(int val) {
a = val;
}
int main() {
ClassA obj;
obj.setA(20);
cout << "Value of a is: " << obj.getA();
return 0;
}
Вывод:

Protected-члены и наследование
Protected-члены доступны внутри класса и в производных классах, обеспечивая контролируемое наследование.
Пример
#include <iostream>
using namespace std;
class ParentClass {
protected:
int value;
};
class ChildClass : public ParentClass {
public:
void setId(int x) { value = x; }
void displayValue() { cout << "Value is: " << value << endl; }
};
int main() {
ChildClass c;
c.setId(21);
c.displayValue();
return 0;
}
Вывод:

Функции-члены внутри и вне класса
Функции-члены могут быть определены внутри класса (inline) или объявлены внутри и определены позже через оператор разрешения области видимости ::.
Пример
#include <iostream>
#include <string>
using namespace std;
class Guru99 {
public:
string tutorial_name;
int id;
void printName();
void printId() { cout << "Tutorial id is: " << id; }
};
void Guru99::printName() {
cout << "Tutorial name is: " << tutorial_name;
}
int main() {
Guru99 guru;
guru.tutorial_name = "C++";
guru.id = 1001;
guru.printName();
cout << endl;
guru.printId();
return 0;
}
Вывод:

Конструкторы и деструкторы
Конструкторы инициализируют объекты при создании, деструкторы очищают ресурсы непосредственно перед уничтожением объекта.
Пример
#include <iostream>
using namespace std;
class ClassA {
public:
ClassA() { cout << "Class constructor called" << endl; }
~ClassA() { cout << "Class destructor called" << endl; }
};
int main() {
ClassA a; // конструктор вызван
int p = 1;
if (p) {
ClassA b; // конструктор вызван, деструктор — в конце блока
} // деструктор для 'b' вызван здесь
return 0;
} // деструктор для 'a' вызван здесь
Вывод:

Ключевые выводы
- C++ фундаментально объектно-ориентирован; классы — строительные блоки.
- Класс группирует данные и связанные функции, создавая переиспользуемый чертеж.
- Используйте
public,private,protectedдля обеспечения инкапсуляции. - Инстанцируйте объекты именем класса и именем объекта.
- Доступ к публичным членам через оператор точка; для приватных — геттеры/сеттеры.
- Функции-члены можно определять внутри класса или снаружи через
::. - Конструкторы инициализируют объекты; деструкторы занимаются очисткой.
Язык C
- Классы и объекты в C#: Фундаменты надёжного ООП
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Дружественные функции и классы в C++: мастерство контроля доступа
- Шаблоны классов в C++: практическое руководство
- Операторы в C++: типы, примеры и практические программы
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Динамическое выделение массивов в C++: практическое руководство с примерами кода
- Структуры (struct) в C++: объяснение с практическим примером
- Освоение std::list в C++: синтаксис, функции и практические примеры
- C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования