Зачем выделять переменные в private, у которых мы в будущем будем изменять значения через специально написанную функцию
class Complex1
{
double real, imaginary;
public:
void SetReal(double real);
void SetImaginary(double real);
Complex1(double real, double imaginary);
};
Complex1::Complex1(double real, double imaginary)
:real(real), imaginary(imaginary) { }
void Complex1::SetReal(double real)
{
this->real = real;
}
void Complex1::SetImaginary(double imaginary)
{
this->imaginary = imaginary;
}
Если можно проще объявить эти переменные в pablic и не писать "эту функцию"?
class Complex2
{
public:
double real, imaginary;
Complex2(double real, double imaginary);
};
Complex2::Complex2(double real, double imaginary)
:real(real), imaginary(imaginary) { }
Ведь результат одинаков?
void main() {
Complex1 z1(0, 10);
Complex2 z2(0, 10);
z1.SetReal(15.5);
z2.real = 15.5;
}
Другие языки программирования и технологии
Вопрос по классам, С++
Как раз хороший пример, но недостаточно расписанный. Представь себе, что в будущем (или у какого-то потомка Complex) понадобится поменять внутреннее представление с алгебраической формы на, скажем, показательную (какие-то рассчеты так делаются быстрее), но сохранить вывод как есть, в алгебраической форме. Тогда, если мы обращаемся к переменным через функции доступа (геттеры и сеттеры), достаточно будет переписать эти функции с простого возврата (записи) данных на преобразование; но прямой доступ приведет к очень неприятным последствиям - объект не будет знать, что данные поменяли, и будет внутренне противоречив.
Чтобы сам класс имел возможность определять и контролировать процесс доступа к его полям. Чтобы извне не было возможности повлиять на код неуместным образом, а также чтобы в любой момент можно было бы изменить класс так, чтобы не пришлось переделывать код другим программистам.
Такова идеология, если прячешь в private - значит тебе надо обезопасить их от доступа из других классов, так как бывает там важные данные, допустим длина выделенной памяти и т. п.
Еще если эти таких переменных штук 100, а для управления достаточно 2, то скрываем лишнее и не выпадает список из кучи нам не нужной информации.
Еще если эти таких переменных штук 100, а для управления достаточно 2, то скрываем лишнее и не выпадает список из кучи нам не нужной информации.
Для обеспечения безопасности. При неосторожном использовании, значение переменной можно поменять, из-за этого можно нарушить работу объекта. Для этого как раз и выделяют две функции, которые называют геттерами и сеттарами. Геттер только возвращает значение переменной, и это означает, что случайного изменения не произойдет. А сеттер как раз намеренно меняет содержимое ячейки.
Ваня Афанащенко
Так вопрос и состоит в том, что зачем писать (например) сеттер, который изменяет содержимое переменной, если можно просто выделить нужные переменные в pablic и изменить содержимое переменной напрямую? Результат ведь один и тот же?
Похожие вопросы
- Вопрос по классам (и видимо по памяти) в С++
- Вопрос по дробления программы на файлы и классам. На данных условиях, как будет выглядеть структуризация?
- Вопрос программистам, хочу пойти на программиста после 9 класса
- Здравствуйте... есть проект-социальная сеть ...вопрос состоит в том как организовать работу классов на сайте? имеется вви
- Вопрос по C++, по классам, можно ли назвать классы объектами? что значит public и private
- Статичная функция внутри класса. какие данные будут доступны всем образцам класса?
- В чем различие ключевых слов public и static в java? И объясните конкретно , что такое экземпляр класса.
- Экземпляра класса, объекты
- С++, объект класса, экземпляр класса, какой тип переменной хранит экземпляр класса? (экземпляр это что? Word, lpstr..?)
- Метод класса с++
z2.real = <преобразование>;
Возможно придется каждый раз писать это преобразование или написать отдельную для этого функция и я возможно ответил на свой вопрос, но возможно у вас есть версия получше.