Класс содержит данные и методы (функции). Для использования класса программы просто должны знать информацию, которую хранит класс (его элементы данных) и методы, которые манипулируют данными (функции). Программам не требуется знать, как работают методы. Программы должны знать только - какую задачу выполняют методы. Программа рассматривает класс как "черный ящик". Программа знает, какие методы необходимо вызвать и какие параметры им передать, но программа ничего не знает о реальной работе, выполняющейся внутри класса (в "черном ящике").
Сокрытие информации представляет собой процесс, в результате которого программе предоставляется только минимальная информация, необходимая для использования класса. Частные и общие элементы класса помогают получить информацию, скрытую внутри программы. Созданные классы использовали метку public для объявления всех элементов класса общими, т.е. видимыми для всей программы. Программа могла непосредственно обратиться к любому элементу класса, используя оператор точку:
|
|
class employee |
{ |
public: |
char name [64]; |
long employee_id; |
float salary; |
void show_employee(void); |
} |
При создании класса можно иметь элементы, чьи значения используются только внутри класса, но обращаться к которым самой программе нет необходимости. Такие элементы являются частными (private), и их следует скрывать от программы. Если не используется метка public, то по умолчанию C++ подразумевает, что все элементы класса являются частными. Программы не могут обращаться к частным элементам класса, используя оператор точку. К частным элементам класса могут обращаться только элементы самого класса. При создании класса следует разделить элементы на частные и общие:
class some_class |
{ |
public: |
int some_variable; |
void initialize_private(int, float); // Общие элементы |
void show_data(void); |
private: |
int key_value; // Частные элементы |
float key_number; |
} |
Метки public и private позволяют определять частные и общие элементы. Программа может использовать оператор точку для обращения к общим элементам:
object.some_variable = 1001; |
object.initialize_private(2002, 1.2345); |
object.show_data() |
Если ваша программа пытается обратиться к частным элементам key_value или key_number, используя точку, компилятор сообщает о синтаксических ошибках.
Необходимо защищать элементы класса от прямого доступа к ним делая их частными. При этом программы не могут непосредственно присваивать значения таким элементам, используя оператор точку. Вместо того чтобы присвоить значение, программа должна вызвать метод класса. Предотвращая прямой доступ к элементам данных, можно гарантировать, что им всегда будут присваиваться допустимые значения. Например, предположим что объект nuclear_reactor вашей программы использует переменную с именем melt_down, которая всегда должна содержать значение в диапазоне от 1 до 5. Если элемент melt_down является общим, программа может непосредственно обратиться к элементу, изменяя его значение произвольным образом:
|
|
nuclear_reactor.melt_down = 101
Если вместо этого сделать переменную частной, то можно использовать метод класса, например assign_meltdown, чтобы присвоить значение этой переменной. Функция assign_meltdown может проверять присваиваемое значение, чтобы убедиться, что оно является допустимым:
int nuke::assign_meltdown(int value) |
{ |
if ((value > 0) && (value <= 5)) |
{ |
melt_down = value; |
return(0); // Успешное присваивание |
} else return(-1); // Недопустимое значение |
} |
Методы класса, которые управляют доступом к элементам данных, представляют собой интерфейсные функции. При создании классов вы будете использовать интерфейсные функции для защиты данных своих классов.
2.5. Использование общих и частных элементов класса.
Следующая программа иллюстрирует использование общих и частных элементов класса. Программа определяет объект типа employee:
class employee |
{ |
public: |
int assign_values(char *, long, float); |
void show_employee(void); |
int change_salary(float); |
long get_id(void); |
private: |
char name [64]; |
long employee_id; |
float salary; |
} |
Класс защищает все свои элементы данных, объявляя их частными. Для доступа к элементам данных программа должна использовать интерфейсные функции. Реализация программы: