Спецификаторы доступа к элементу public и private (а также, как мы увидим в главе 9 «Наследование», protected — защищенные) используются для управления доступом к данным-элементам класса и функциям-элемен- там. По умолчанию режим доступа для классов — private (закрытый), так что все элементы после заголовка класса и до первого спецификатора доступа являются закрытыми. После каждого спецификатора режим доступа, определенный им, действует до следующего спецификатора или до завершающей правой скобки (}) определения класса. Спецификаторы private, public и protected могут быть повторены, но такое употребление редко и может привести к беспорядку.
Закрытые элементы класса могут быть доступны только для функций- элементов (и дружественных функций) этого класса. Открытые элементы класса могут быть доступны для любых функций в программе.
Основная задача открытых элементов состоит в том, чтобы дать клиентам класса представление о возможностях (услугах), которые обеспечивает класс. Этот набор услуг составляет открытый интерфейс класса. Клиентов класса не должно касаться, каким образом класс выполняет их задачи. Закрытые
элементы класса и описания открытых функций-элементов недоступны для клиентов класса. Эти компоненты составляют реализацию (implementation) класса.
элементы класса и описания открытых функций-элементов недоступны для клиентов класса. Эти компоненты составляют реализацию (implementation) класса.
Замечание по технике программирования 6.10
С++ способствует созданию программ, не зависящих от реализации. Если, изменяется реализация класса, используемого программой, не зависящей от реализации, то код этой программы не требует изменения, но может потребоваться его перекомпиляция.
Типичная ошибка программирования 6.4
Попытка с помощью функции, не являющейся элементом определенного класса (или другом этого класса) получить доступ к элементам этого класса.
Программа на рис. 6.6 демонстрирует, что закрытые элементы класса доступны только через открытый интерфейса класса, включающий открытые функции-элементы. Во время компиляции этой программы компилятор выдает две ошибки, объявляющие, что закрытые элементы, указанные в каждом операторе, недоступны. Программа на рис. 6.6 включает timel.h и компилируется вместе с файлом timel.cpp, описанном на рис. 6.5.
// FIG6_6.СРР
// Демонстрация ошибок вследствие попыток доступа //к закрытым элементам класса finclude -ciostream.h> #include "timel.h"
main() {
Time t;
hour' недоступно |
// Ошибка: 'Time t.hour = 7;
// Ошибка: 'Time :: cout << " минута = minute' недоступно " « t.minute;
return 0;
}
Compiling FIG6_6.CPP: Error FIG6_6.CPP 12: 'Time Error FIG6 6.CPP 15: 'Time
hour' is not accessible minute' is not accessible
Рис. 6.6. Ошибочная попытка доступа к закрытым элементам класса
Хороший стиль программирования 6.4
Если вы намереваетесь сначала перечислить в определении класса закрытые эле менты, используйте явно метку private, несмотря на то, что private предполагается по умолчанию. Это облегчит чтение программы. Но мы предпочитаем первым в определении класса помещать список открытой части public.
Несмотря на то, что спецификаторы public и private могут повторяться и чередоваться, перечисляйте сначала все элементы класса открытой группы, а затем все элементы закрытой группы. Это концентрирует внимание клиентов класса в большей степени на его открытом интерфейсе, чем на реализации класса.
Делайте все данные-элементы класса закрытыми. Используйте открытые функции- элементы для задания и получения значений закрытых данных-элементов. Такая архитектура помогает скрыть реализацию класса от его клиентов, что снижает число ошибок и улучшает модифицируемость программ.
Клиент класса может быть функцией-элементом другого класса или глобальной функцией.
По умолчанию доступ к элементам класса — private. Доступ к элементам класса можно явно установить как public, protected (как мы увидим в главе 9) или private. В отличие от этого доступ к элементам структуры struct по умолчанию — public. Доступ к элементам структуры struct также может быть установлен явно как public, protected или private.
Разработчики классов используют доступ типа public, protected или private, чтобы обеспечить скрытие информации и принцип наименьших привилегий.
Заметим, что элементы класса по умолчанию являются закрытыми, так что никогда не возникает необходимости явно использовать спецификатор доступа к элементам private. Однако, многие программисты предпочитают сначала описывать интерфейс класса (т.е. открытые элементы класса), а затем перечислять закрытые элементы, откуда вытекает необходимость явного использования в определении класса спецификатора доступа к элементам private.
Использование спецификаторов доступа к элементам public, protected и private
лишь по одному разу в любом определении класса позволяет избежать путаницы.
Из того, что данные класса закрытые, не следует, что клиенты не могут изменять эти данные. Данные могут быть изменены функциями-элементами или друзьями этого класса. Как мы увидим, эти функции должны быть спроектированы так, чтобы гарантировать целостность данных.
Доступ к закрытым данным класса должен тщательно контролироваться использованием функций-элементов, называемых функциями доступа. Например, чтобы разрешить клиентам прочитать закрытое значение данных, класс может иметь функцию «получить» («get»). Чтобы дать клиентам возможность изменять закрытые данные, класс может иметь функцию «установить» («set»). Казалось бы, подобные изменения противоречат смыслу закрытых данных. Но функция-элемент set (установить) может обеспечить проверку правильности данных (например, проверку диапазона) и дать уве- ренность в том, что данные установлены верно. Функция set может также быть переводчиком между формой данных, используемой в интерфейсе, и формой, используемой в реализации. Функция get (получить) не требует представления данных в «сыром», необработанном виде; функция get может редактировать данные и ограничивать область данных, видимых клиенту.
Замечание по технике программирования 6.13
Разработчик класса не обязательно должен снабжать каждый элемент закрытых дан - ных функциями get и set; такие возможности должны быть обеспечены, только тогда, когда это имеет смысл, и лишь после тщательного обдумывания разработчиком класса.
Замечание по технике программирования 6.14
Комментариев нет:
Отправить комментарий