Классы и объекты

Глава 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 для работы с текущим объектом