Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Область действия класса и доступ к элементам класса.
Имена переменных и функций, объявленных в определении класса, а также элементы данных класса и его элементы-функции, принадлежат области действия класса. Функции, не являющиеся элементами класса, определяются в области действия файла. Внутри области действия класса элементы класса непосредственно доступны для всех элементов-функций этого класса и допускают обращение просто по имени. Вне области действия класса на элементы класса можно ссылаться либо через имя объекта, либо через ссылку, либо через указатель на объект. Элементы-функции класса могут быть перегружены, но только функциями в области действия этого класса. Для того, чтобы перегрузить элемент-функцию, просто задайте в области определения класса прототип для каждой версии перегруженной функции и напишите для каждой версии отдельное определение. Элементы-функции имеют внутри класса область действия функции. Если в функции-элементе определена переменная с тем же именем, что и переменная с областью действия класса, то последняя будет скрыта переменной функции-элемента внутри области действия функции. Доступ к таким скрытым переменным можно получить посредством операции разрешения области действия, поместив перед этой операцией имя класса. Доступ к глобальным переменным может быть получен с помощью одноместной операции разрешения области действия. Операции, используемые для доступа к элементам класса, идентичны операциям для доступа к элементам структуры. Для доступа к элементам объекта применяется операция выбора элемента -точка (. ) - в сочетании с именем объекта или со ссылкой на объект. Операция выбора элемента - стрелка ( -> ) - применяется в сочетании с указателем на объект. Управление доступом к элементам класса. Метки public: и private: (и protected:, как мы увидим далее) используются для управления доступом к элементам данных и элементам-функциям класса. Режимом доступа по умолчанию для классов является private:, поэтому все элементы после заголовка класса и до первой метки являются закрытыми. После каждой метки задаваемый ею режим действует вплоть до следующей метки или до завершающей правой фигурной скобки ( } ) определения класса. Метки public:, private: и protected: могут повторяться, однако такое их использование нечасто и может приводить к путанице. К закрытым элементам класса могут иметь доступ только элементы (и друзья) этого класса. К открытым элементам класса можно обращаться из любой функции программы. Основным назначением открытых элементов класса является предоставление клиентам информации о доступных в классе услугах. Этот набор услуг образует открытый интерфейс класса. Клиенты класса не должны заботиться о способе выполнения классом своих задач. Закрытые элементы класса, как и определения его открытых элементов-функций, недоступны для клиентов класса. Эти компоненты составляют реализацию класса. Клиентом класса может быть как функция-элемент другого класса, так и глобальная функция. Доступом по умолчанию для элементов класса является private. Доступ к элементам класса может быть явно сделан защищенным или открытым. То, что данные класса являются закрытыми, не обязательно означает, что клиенты не могут производить изменений в этих данных. Данные могут быть изменены элементами-функциями или друзьями класса. Как мы увидим, такие функции должны разрабатываться так, чтобы гарантировать целостность данных. Доступ к закрытым данным класса может строго контролироваться путем использования элементов-функций, называемых функциями доступа. Например, для того, чтобы разрешить клиентам считывать значение закрытого элемента данных, класс может предусматривать так называемую «get»-функцию. Чтобы давать возможность клиентам изменять закрытые данные, класс может иметь так называемую «set»-функцию. Может показаться, что такого рода изменение данных нарушает представление о закрытых данных. Однако set-функция может иметь средства проверки допустимости данных (например, проверку диапазона), чтобы гарантировать правильную установку соответствующего значения. Get-функция не обязана выдавать данные в «сыром» виде; напротив, get-функция может редактировать данные и ограничивать представление данных, которые будет видеть клиент.
Функции доступа и сервисные функции. Не все элементы-функции целесообразно делать общедоступными, т.е. частью интерфейса класса. Некоторые элементы-функции остаются закрытыми и служат в качестве вспомогательных для других функций класса. Функции доступа могут считывать или отображать данные. Другим распространенным применением функций доступа является проверка истинности либо ложности условий - подобные функции часто называют предикатными функциями. Примером предикатной функции может служить функция isEmpty для любого контейнерного класса, такого, как связанный список, стек или очередь. Программа обычно проверяет условие isEmpty перед попыткой считывания еще одного элемента из контейнерного объекта. Предикатная функция isFull может проверять объект контейнерного класса, чтобы установить, что в нем отсутствует дополнительное пространство. На рис. демонстрируется понятие сервисной функции. Сервисная функция не является частью интерфейса класса. Это закрытая функция-элемент, которая поддерживает работу открытых функций-элементов класса. Сервисные функции не предназначены для использования клиентами класса. //Файл sales.h #ifndef SALES_H #define SALES_H class SalesPerson {public: SalesPerson(); void setSales(); void printAnnualSales(); private: double sales[13]; double totalAnnualSales(); }; #endif Рис. 8. Определение класса SalesPerson (файл sales.h ). Часть 1 из 3. // Файл sales.cpp #include < iostream.h> #include < iomanip.h> #include " sales.h" SalesPerson:: SalesPerson() { for (int i=0; i< =12; i++) sales[i]=0.0; } void SalesPerson:: setSales() { for (int i=1; i< =12; i++) {cout< < " Enter sales amount for month " < < i< < ": "; cin> > sales[i]; } } double SalesPerson:: totalAnnualSales() { double total=0.0; for (int i=1; i< =12; i++) total += sales[i]; return total; } void SalesPerson:: printAnnualSales() { cout< < setprecision (2)< < setiosflags (ios:: fixed | ios:: showpoint) < < " \nThe total annual sales are: $" < < totalAnnualSales()< < endl; } Рис.. Реализация класса SalesPerson (файл sales.cpp ). Часть 2 из 3. //Пограмма-тестер. #include " sales.h" main() { SalesPerson s; s.setSales(); s.printAnnualSales(); return 0; } Рис.. Программа-тестер. Часть 3 из 3. Класс SalesPerson содержит массив из 12 ежемесячных показателей сбыта, инициализируемых нулями в конструкторе; функция setSales присваивает показателям сбыта задаваемые пользователем значения. Открытая функция-элемент printAnnualSales выводит итоговый сбыт за последние 12 месяцев. Сервисная функция totalAnnualSales суммирует 12 ежемесячных показателей сбыта для функции printAnnualSales. Элемент-функция printAnnualSales преобразует показатели сбыта в долларовый формат. Вызов setprecision(2) указывает, что справа от десятичной точки должны выводиться два знака «точности», как нам и требуется для долларовых сумм вроде 23.47. Этот вызов называется «параметризованным манипулятором потока». Программа, применяющая такого рода вызовы, должна также содержать директиву препроцессора #include < iomanip.h> Строка setiosflags(ios:: fixed | ios:: showpoint); задает отображение показателя сбыта в так называемом формате с фиксированной точкой (в противоположность экспоненциальному формату). Опция showpoint принудительно выводит десятичную точку и нули в конце числа, даже если последнее является целой долларовой суммой, как в случае 47.00. В C++ такое число было бы выведено просто как 47, если бы опция showpoint не была установлена.
Популярное:
|
Последнее изменение этой страницы: 2016-04-10; Просмотров: 1889; Нарушение авторского права страницы