Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Область действия класса и доступ к элементам класса.



Имена переменных и функций, объявленных в определении класса, а так­же элементы данных класса и его элементы-функции, принадлежат области действия класса. Функции, не являющиеся элементами класса, определяют­ся в области действия файла.

Внутри области действия класса элементы класса непосредственно доступ­ны для всех элементов-функций этого класса и допускают обращение просто по имени. Вне области действия класса на элементы класса можно ссылаться либо через имя объекта, либо через ссылку, либо через указатель на объект.

Элементы-функции класса могут быть перегружены, но только функция­ми в области действия этого класса. Для того, чтобы перегрузить элемент-фун­кцию, просто задайте в области определения класса прототип для каждой вер­сии перегруженной функции и напишите для каждой версии отдельное опре­деление.

Элементы-функции имеют внутри класса область действия функции. Если в функции-элементе определена переменная с тем же именем, что и пере­менная с областью действия класса, то последняя будет скрыта переменной функции-элемента внутри области действия функции. Доступ к таким скры­тым переменным можно получить посредством операции разрешения области действия, поместив перед этой операцией имя класса. Доступ к глобальным переменным может быть получен с помощью одноместной операции разреше­ния области действия.

Операции, используемые для доступа к элементам класса, идентичны опе­рациям для доступа к элементам структуры. Для доступа к элементам объекта применяется операция выбора элемента -точка (. ) - в сочетании с именем объекта или со ссылкой на объект. Операция выбора элемента - стрелка ( -> ) - применяется в сочетании с указателем на объект.

Управление доступом к элементам класса.

Метки 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. Элемент-функция printAnnu­alSales преобразует показатели сбыта в долларовый формат.

Вызов setprecision(2)

указывает, что справа от десятичной точки должны выводиться два знака «точ­ности», как нам и требуется для долларовых сумм вроде 23.47. Этот вызов на­зывается «параметризованным манипулятором потока». Программа, применяющая такого рода вызовы, должна также содержать директиву пре­процессора

#include < iomanip.h> Строка setiosflags(ios:: fixed | ios:: showpoint);

задает отображение показателя сбыта в так называемом формате с фиксирован­ной точкой (в противоположность экспоненциальному формату). Опция showpoint принудительно выводит десятичную точку и нули в конце числа, даже если последнее является целой долларовой суммой, как в случае 47.00. В C++ такое число было бы выведено просто как 47, если бы опция showpoint не была установлена.

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-04-10; Просмотров: 1731; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.028 с.)
Главная | Случайная страница | Обратная связь