П. 5.3. Объявление объекта
Объект – это конкретный экземпляр абстрактного класса. Объявление класса является логической абстракцией, которая задает новый тип объекта. Объявление же объекта создает физическую сущность объекта такого типа, таким образом, объект занимает память.
Объект нового типа (нового класса) определяется точно так же, как и любая целочисленная переменная: сначала указывается тип (имя класса), а затем имя переменной (имя объекта).
Объявим объект:
Car myZaparozec; //определение объекта класса (или типа) Car
П
осле
определения объекта класса возникает
необходимость получить доступ к членам
(переменным и методам) этого объекта.
Для этого используется оператор «.»
точка, который позволяет обратиться к
элементам объекта непосредственно. При
этом компилятор выдаст подсказку вида:
Поэтому, для того, чтобы присвоить значение переменной-члену itsAge объекта myZaparozec, можно записать:
myZaparozec.itsYear =20;
Важно помнить, что значения присваиваются не классу, а переменным-членам объекта.
Для вызова метода Start( ) используется запись:
myZaparozec.Start ( )
П. 5.4. Закрытые и открытые члены класса
Все члены класса (и данные, и методы) по умолчанию являются закрытыми. К закрытым членам могут обращаться только те методы (функции-члены), которые принадлежат этому классу. Открытые члены доступны для всех других функций программы.
Если из определения класса 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;
Но прежде необходимо провести процедуру реализации методов класса.
