Все члены класса (и данные, и методы) по умолчанию являются закрытыми. К закрытым членам могут обращаться только те методы (функции-члены), которые принадлежат этому классу. Открытые члены доступны для всех других функций программы.
Если из определения класса Car убрать строку «public: », тогда все переменные и метод класса Car окажутся закрытыми, и любое обращение к ним извне объекта вызовет ошибку компиляции.
Область public в объявлении класса – это посредник между объектом и внешним миром. Эта часть класса называется открытым интерфейсом класса и может рассматриваться как соглашение с той частью программы, в которой создается и используется объект – клиентом. К открытому интерфейсу не относится ничто в объявлении класса из области private.
Ниже приведен пример объявления класса и определение его объекта.
#include <iostream>
using namespace std;
// объявление класса Car
class Car
{
unsigned short Key;
public:
unsigned int itsYear;
unsigned int numbDoors;
void Start();
};
int main()
{
//определение объекта класса Car
Car myZaparozec;
myZaparozec.itsYear =20; //обращение к данным-членам
myZaparozec.numbDoors =2;
cout<<"To my automobile "<<myZaparozec.itsYear <<" years"<<endl;
cout<< "At my automobile "<<myZaparozec.numbDoors<<" doors"<<endl;
return 0;
}
Результат работы программы:
To my automobile 20 years
At my automobile 2 doors
Согласно общему подходу к использованию классов, переменные-члены класса следует оставлять закрытыми. Благодаря этому обеспечивается инкапсуляция (сокрытие) данных внутри класса. Тогда для того, чтобы передавать и возвращать значения закрытых переменных класса необходимо создавать открытые функции, называемые методами доступа. Открытый метод доступа – это функция-член класса, предназначенная для манипулирования закрытыми переменными-членами класса.
|
Пример1. Здесь показан класс Car, в котором объявлены закрытые переменные-члены и открытые методы доступа к закрытым данным[16].
class Car
{
// Закрытый элемент класса
private:
unsigned short Key;
// Открытые методы доступа (функции-члены)
public:
void SetKey (unsigned short Num);
unsigned short GetKey();
};
Поскольку Key является закрытой переменной класса, она не доступна для любой функции вне Car. Однако, поскольку методы SetKey() и GetKey() являются членами Car, они имеют доступ к Key. Более того, SetKey() и GetKey(), являясь открытыми членами Car, могут вызываться из любой части программы, использующей данный класс.
Для чего нужен подобный косвенный доступ? Ведь значительно проще и легче использовать сами данные вместо того, чтобы работать с ними через дополнительные функции доступа. Дело в том, что применение методов доступа позволяет скрыть от пользователя подробности хранения данных в объектах, предоставляя в то же время методы использования этих данных. В результате можно совершенствовать способы хранения и обработки данных внутри класса, не переписывая при этом методы доступа и вызова их во внешнем программном коде.
Вернемся к примеру. У класса Car есть функция GetKey(), позволяющая получать данные для какой-либо внешней функции. Тогда класс можно модернизировать сколько угодно, и это никак не повлияет на возможность функции передавать данные в основной коде программы.
Рекомендуется все данные-элементы класса делать закрытыми, используя открытые функции-элементы для задания и получения значения закрытых данных-элементов. Такая архитектура позволяет скрыть реализацию класса от клиентов, снижая тем самым число ошибок и улучшая модификацию программ.
|
Параметр Num служит для присваивания переменной Key значения извне объекта.
Пример2. Чтобы установить значение ключа для автомобиля извне, нужно передать соответствующее значение методу SetKey () (установить ключ):
Car myZaparozec;
unsigned short Pass;
myZaparozec.SetKey (65000); // значение параметра Num =65000
Pass =myZaparozec.GetKey ();
cout<<"The key of my automobile "<<Pass<<endl;
Но прежде необходимо провести процедуру реализации методов класса.