Elementor Header #8

31. Свойства

1. Введение

В C++ свойства — это механизм, который позволяет управлять доступом к членам класса и обеспечивать контроль над изменениями данных. Свойства позволяют создать интерфейс для работы с данными объекта, скрывая внутреннюю реализацию и защищая данные от некорректного изменения.

2. Основные понятия

Свойства в C++ реализуются с помощью методов доступа, таких как геттеры (методы для получения значения) и сеттеры (методы для установки значения). Это позволяет разделить логику работы с данными и логику их использования.

3. Геттеры и сеттеры

Геттеры (методы доступа для получения значения) позволяют получить значение приватного члена класса.

Сеттеры (методы доступа для установки значения) позволяют изменить значение приватного члена класса.

Пример использования геттеров и сеттеров

				
					class Person {
private:
    std::string name;
    int age;

public:
    // Геттер для имени
    std::string getName() const {
        return name;
    }

    // Сеттер для имени
    void setName(const std::string& newName) {
        name = newName;
    }

    // Геттер для возраста
    int getAge() const {
        return age;
    }

    // Сеттер для возраста
    void setAge(int newAge) {
        if (newAge >= 0) {  // Проверка на допустимость возраста
            age = newAge;
        }
    }
};

				
			

4. Использование свойств

Свойства можно использовать для защиты данных и обеспечения корректности их изменения. Например, вы можете проверить значения перед тем, как установить их в приватные члены класса.

Пример проверки значений

				
					class BankAccount {
private:
    double balance;

public:
    // Геттер для баланса
    double getBalance() const {
        return balance;
    }

    // Сеттер для баланса с проверкой
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        }
    }
};

				
			

5. Виртуальные геттеры и сеттеры

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

Пример виртуальных методов

				
					class Shape {
public:
    virtual double getArea() const = 0;  // Чисто виртуальный метод

    // Виртуальный деструктор
    virtual ~Shape() {}
};

class Circle : public Shape {
private:
    double radius;

public:
    Circle(double r) : radius(r) {}

    double getArea() const override {
        return 3.14159 * radius * radius;
    }
};

				
			

6. Свойства и константные объекты

Методы доступа (геттеры) могут быть помечены как const, чтобы указывать, что они не изменяют состояние объекта. Это позволяет вызывать их на константных объектах.

Пример константного метода доступа

				
					class Rectangle {
private:
    double width;
    double height;

public:
    Rectangle(double w, double h) : width(w), height(h) {}

    // Константный геттер
    double getWidth() const {
        return width;
    }

    double getHeight() const {
        return height;
    }
};

				
			

7. Примеры использования свойств

Пример 1: Пример класса с приватными членами и методами доступа

				
					#include <iostream>

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

public:
    // Конструктор
    Student(const std::string& n, int g) : name(n), grade(g) {}

    // Геттер для имени
    std::string getName() const {
        return name;
    }

    // Сеттер для имени
    void setName(const std::string& n) {
        name = n;
    }

    // Геттер для оценки
    int getGrade() const {
        return grade;
    }

    // Сеттер для оценки
    void setGrade(int g) {
        if (g >= 0 && g <= 100) {
            grade = g;
        }
    }
};

int main() {
    Student student("Alice", 85);

    std::cout << "Имя: " << student.getName() << std::endl;
    std::cout << "Оценка: " << student.getGrade() << std::endl;

    student.setGrade(90);
    std::cout << "Новая оценка: " << student.getGrade() << std::endl;

    return 0;
}

				
			

Пример 2: Класс с проверкой и защитой данных

				
					#include <iostream>

class Temperature {
private:
    double celsius;

public:
    // Конструктор
    Temperature(double temp) : celsius(temp) {}

    // Геттер для температуры
    double getCelsius() const {
        return celsius;
    }

    // Сеттер для температуры с проверкой
    void setCelsius(double temp) {
        if (temp >= -273.15) {  // Температура не может быть ниже абсолютного нуля
            celsius = temp;
        } else {
            std::cout << "Ошибка: температура ниже абсолютного нуля!" << std::endl;
        }
    }
};

int main() {
    Temperature temp(25.0);

    std::cout << "Температура: " << temp.getCelsius() << "°C" << std::endl;

    temp.setCelsius(-300.0);  // Некорректное значение
    std::cout << "Попытка установки некорректного значения: " << temp.getCelsius() << "°C" << std::endl;

    return 0;
}

				
			

Заключение

Свойства позволяют эффективно управлять доступом к членам класса, защищать данные от некорректных изменений и обеспечивать корректность работы методов. Использование геттеров и сеттеров помогает создать чистый интерфейс для работы с объектами и делает ваш код более гибким и поддерживаемым.

8. Тестовое задание

  1. Создайте класс Person, который содержит:

    • Приватные члены firstName и lastName (строкового типа).
    • Конструктор для инициализации этих полей.
    • Геттеры и сеттеры для каждого из полей.
    • Метод для отображения полного имени.
  2. В функции main() создайте объект класса Person, установите его имя и фамилию через сеттеры, и выведите полное имя через метод отображения.

Примерный код:

				
					#include <iostream>

class Person {
private:
    std::string firstName;
    std::string lastName;

public:
    // Конструктор
    Person(const std::string& fName, const std::string& lName)
        : firstName(fName), lastName(lName) {}

    // Геттеры
    std::string getFirstName() const {
        return firstName;
    }

    std::string getLastName() const {
        return lastName;
    }

    // Сеттеры
    void setFirstName(const std::string& fName) {
        firstName = fName;
    }

    void setLastName(const std::string& lName) {
        lastName = lName;
    }

    // Метод для отображения полного имени
    std::string getFullName() const {
        return firstName + " " + lastName;
    }
};

int main() {
    Person person("John", "Doe");

    std::cout << "Полное имя: " << person.getFullName() << std::endl;

    person.setFirstName("Jane");
    person.setLastName("Smith");

    std::cout << "Обновленное полное имя: " << person.getFullName() << std::endl;

    return 0;
}

				
			

Запустите программу и убедитесь, что она корректно устанавливает и отображает полное имя.

logo