приховування інформації
Урок 22. Приватні та загальні дані
В уроці 21 ви створили свої перші класи в C ++. При цьому ви включали мітку public в визначення класу, щоб забезпечити програмі доступ до кожного елементу класу. З даного уроку ви дізнаєтеся, як атрибути public і private керують доступом до елементів класу з боку програми. Ви дізнаєтеся, що ваші програми можуть звернутися до загальних (public) елементам з будь-якої функції. З іншого боку, ваша програма може звертатися до приватних (private) елементам тільки у функціях даного класу. Цей урок докладно досліджує приватні і загальні елементи. До кінця цього уроку ви освоїте наступні основні концепції:
Щоб керувати тим, як ваші програми звертаються до елементів класу, C ++ дозволяє вам визначати елементи як приватні або загальні.
Приватні елементи дають можливість класу приховати інформацію, яку програму не потрібно знати.
Клас, який використовує приватні елементи, забезпечує інтерфейсні функції, які звертаються до приватних елементів класу.
Як уже коротко обговорювалося в уроці 21, ви повинні помістити в визначення класу стільки інформації про об'єкт, скільки вважаєте за необхідне. При цьому об'єкти стають самозабезпечення, що може підвищити ймовірність їх повторного використання декількома програмами.
Як ви вже знаєте, клас містить дані і методи (функції). Для використання класу програми просто повинні знати інформацію, яку зберігає клас (його елементи даних) і методи, які маніпулюють даними (функції). Вашим програмам не потрібно знати, як працюють методи. Більш того, програми повинні знати тільки, яке завдання виконують методи. Наприклад, припустимо, що у вас є клас file. В ідеалі ваші програми повинні знати тільки те, що цей клас забезпечує методи file.print, який друкує отформатированную копію поточного файлу, або file.delete, який видаляє файл. Вашій програмі не потрібно знати, як ці два методи працюють. Іншими словами, програма повинна розглядати клас як "чорний ящик". Програма знає, які методи необхідно викликати і які параметри їм передати, але програма нічого не знає про рельной роботі, що виконується всередині класу (в "чорному ящику").
При створенні класу ви могли б мати елементи, чиї значення використовуються тільки всередині класу, але звертатися до яких самій програмі немає необхідності. Такі елементи є приватними (private), і їх слід приховувати від програми. Якщо ви не використовуєте мітку public, то за замовчуванням C ++ має на увазі, що всі елементи класу є приватними. Ваші програми не можуть звертатися до приватних елементів класу, використовуючи оператор крапку. До приватним елементам класу можуть звертатися тільки елементи самого класу. При створенні класу вам слід розділити елементи на приватні і загальні, як показано нижче:
Як бачите, мітки public і private легко дозволяють визначати, які елементи є приватними, а які загальними. В даному випадку програма може використовувати оператор точку для звернення до загальних елементів, як показано нижче:
Якщо ваша програма намагається звернутися до приватних елементів key_value або key_number, використовуючи точку, компілятор повідомляє про синтаксичні помилки.
Як правило, ви будете захищати елементи класу від прямого доступу до них роблячи їх приватними. При цьому програми не можуть безпосередньо надавати значення таким елементам, використовуючи оператор крапку. Замість того щоб привласнити значення, програма повинна викликати метод класу. Запобігаючи прямий доступ до елементів даних, ви, таким чином, можете гарантувати, що їм завжди будуть присвоюватися допустимі значення. Наприклад, припустимо що об'єкт nuclear_reactor вашої програми використовує змінну з ім'ям melt_down, яка завжди повинна містити значення в діапазоні від 1 до 5. Якщо елемент melt_down є загальним, програма може безпосередньо звернутися до елементу, змінюючи його значення довільним чином:
Якщо замість цього ви робите змінну приватної, то можете використовувати метод класу, наприклад assign_meltdown, щоб привласнити значення цієї змінної. Як показано нижче, функція assign_meltdown може перевіряти привласнюється значення, щоб переконатися, що воно є допустимим:
int nuke :: assign_meltdown (int value)
Методи класу, які керують доступом до елементів даних, являють собою інтерфейсні функції. При створенні класів ви будете використовувати інтерфейсні функції для захисту даних своїх класів.
Загальні і приватні елементи