Глава 4. Объектно-ориентированное программирование в C++ #
4.1 Классы и объекты #
1. Определение класса #
Класс в C++ - это пользовательский тип данных, который объединяет данные (поля) и методы (функции) для работы с этими данными.
// Базовое определение класса
class Person {
// Тело класса
};
// Более развернутый пример
class Student {
// Поля класса
std::string name;
int age;
double gpa;
public:
// Публичные методы
void setName(std::string studentName) {
name = studentName;
}
std::string getName() {
return name;
}
};
int main() {
// Создание объекта класса
Student john;
john.setName("John Doe");
std::cout << john.getName(); // Выведет "John Doe"
return 0;
}
2. Конструкторы и деструкторы #
Конструкторы #
Конструкторы - специальные методы, вызываемые при создании объекта, используются для инициализации его полей.
class Rectangle {
private:
double width;
double height;
public:
// Конструктор по умолчанию
Rectangle() {
width = 0;
height = 0;
}
// Конструктор с параметрами
Rectangle(double w, double h) {
width = w;
height = h;
}
// Конструктор копирования
Rectangle(const Rectangle& other) {
width = other.width;
height = other.height;
}
};
int main() {
// Использование разных конструкторов
Rectangle rect1; // Вызов конструктора по умолчанию
Rectangle rect2(5.0, 3.0); // Вызов конструктора с параметрами
Rectangle rect3 = rect2; // Вызов конструктора копирования
return 0;
}
Деструкторы #
Деструкторы освобождают ресурсы, занятые объектом при его уничтожении.
class ResourceManager {
private:
int* data;
public:
// Конструктор
ResourceManager() {
data = new int[100]; // Выделение памяти
}
// Деструктор
~ResourceManager() {
delete[] data; // Освобождение памяти
}
};
3. Методы класса #
Методы - функции, определенные внутри класса, которые могут работать с его полями.
class Circle {
private:
double radius;
const double PI = 3.14159;
public:
// Метод установки радиуса
void setRadius(double r) {
radius = r;
}
// Метод вычисления площади
double calculateArea() {
return PI * radius * radius;
}
// Константный метод (не изменяет состояние объекта)
double getRadius() const {
return radius;
}
};
int main() {
Circle circle;
circle.setRadius(5.0);
std::cout << "Площадь: " << circle.calculateArea(); // Вычислит площадь круга
return 0;
}
4. Модификаторы доступа #
C++ поддерживает три основных модификатора доступа:
class AccessExample {
private: // Доступ только внутри класса
int privateField;
protected: // Доступ внутри класса и его наследников
int protectedField;
public: // Доступ из любого места программы
int publicField;
// Публичный метод для работы с приватным полем
void setPrivateField(int value) {
privateField = value;
}
};
5. Инкапсуляция #
Инкапсуляция - сокрытие внутренней реализации класса и предоставление контролируемого интерфейса.
class BankAccount {
private:
// Приватные поля, недоступные напрямую
double balance;
std::string accountNumber;
public:
// Публичные методы для управления счетом
void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
bool withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
return true;
}
return false;
}
double getBalance() const {
return balance;
}
};
int main() {
BankAccount account;
account.deposit(1000);
account.withdraw(500);
std::cout << "Баланс: " << account.getBalance(); // Безопасный доступ к балансу
return 0;
}
6. Указатель this #
Указатель this
ссылается на текущий объект класса.
class Counter {
private:
int value;
public:
// Использование this для разрешения неоднозначности
void setValue(int value) {
// this->value обозначает поле класса
// value - входной параметр
this->value = value;
}
// Возврат ссылки на текущий объект
Counter& increment() {
value++;
return *this;
}
int getValue() const {
return value;
}
};
int main() {
Counter counter;
// Цепочка вызовов методов благодаря возврату *this
counter.increment().increment().increment();
std::cout << "Значение: " << counter.getValue(); // Выведет 3
return 0;
}
Заключение #
Объектно-ориентированное программирование в C++ предоставляет мощные средства для создания структурированного и модульного кода. Понимание классов, объектов, их свойств и механизмов является ключевым для эффективной разработки программного обеспечения.
Основные концепции: #
- Класс как пользовательский тип данных
- Конструкторы для инициализации объектов
- Деструкторы для освобождения ресурсов
- Модификаторы доступа для контроля видимости
- Инкапсуляция как принцип организации кода
- Указатель
this
для работы с текущим объектом