Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции АиП.doc
Скачиваний:
93
Добавлен:
15.11.2018
Размер:
668.67 Кб
Скачать

Void Meow();

};

Здесь объявлены закрытые переменные itsAge и itsWeight, а также закрытый метод Meow(), поскольку по умолчанию все члены класса являются закрытыми. Это значит, что если член класса не указан как открытый явно, то он считается закрытым. Например, если в функции main() написать нижеследующее, то компилятор пометит эту строку как ошибку:

Int main()

{

Cat Boots;

Boots.itsAge=5; /* Ошибка! Нельзя обращаться к закрытым данным!*/

Чтобы разрешить доступ извне к переменным-членам объектов созданных на базе класса Cat, необходимо сделать их открытыми:

Class Cat

{

public:

unsigned int itsAge;

unsigned int itsWeight;

Void Meow();

};

Теперь все члены itsAge, itsWeight и Meow() стали открытыми, а строка Boots.itsAge=5; больше не вызывает у компилятора проблем.

В объявлении ключевое слово public применяется ко всем расположенным ниже членам до тех пор, пока не встретится ключевое слово private, и наоборот. Согласно общей стратегии использования классов, его переменные-члены следует оставлять закрытыми. Благодаря этому обеспечивается инкапсуляция (скрытность) данных внутри класса. Следовательно, чтобы передавать и возвращать значения закрытых переменных, необходимо создать открытые функции, известные как методы доступа (accessor method).

Открытый метод доступа – это функция-член класса, предназначенная для установки и получения значений закрытых переменных-членов класса.

Применение методов доступа позволяет скрыть от пользователя подробности хранения данных в объектах, предоставляя в то же время методы их использования. В результате можно модернизировать способы хранения и обработки данных внутри класса, не переписывая при этом методы доступа и вызовы их во внешнем программном коде.

Такой подход облегчает сопровождение программы в будущем. Можно сказать, что он продлевает жизненный цикл программы, поскольку вносимые при модернизации изменения не затрагивают программу в целом.

Объявление методов или данных закрытыми позволяет компилятору обнаруживать в программе ошибки прежде, чем они станут причиной неприятностей. Закрытые переменные не гарантируют «секретности» данных, поскольку любой достаточно опытный программист при желании сможет обойти запрет и получить к ним доступ. По этому поводу Страуструп (Stroustrup), автор языка С++, сказал: «Механизмы управления доступом в С++ обеспечивают защиту от несчастного случая, но не от мошенника».

Для каждой функции доступа, наряду с другими методами, объявленными в классе, должна существовать реализация. Реализация – это описание действий функции.

Определение функции-члена начинается аналогично определению обычной функции. Сначала указывается тип данных, которые возвращает функция (или тип void, если она ничто не возвращает). Затем следует имя класса, два двоеточия, имя функции и, наконец, параметры функции. В следующем ниже листинге показано объявление класса Cat, в котором находится реализация методов доступа к данным и одна обычная функция-член.

Листинг 8.1. Реализация методов класса

#include <iostream>

class Cat { //начало объявления класса

public:

int GetAge() const;

void SetAge(int age);

void Meow();

private:

int itsAge;

};

//Реализация открытой функции доступа GetAge()

//возвращающей значение элемента itsAge

int Cat::GetAge() const {

return itsAge;

}

//Реализация открытой функции доступа SetAge()

//устанавливающей значение элемента itsAge

void Cat::SetAge(int age) {

itsAge=age;

}

//Реализация метода Meow()

void Cat::Meow() {

std::cout<<"Meow.\n";

}

int main()

{

Cat Frisky;

Frisky.SetAge(5);

Frisky.Meow();

std::cout<<"Frisky is a cat who is ";

std::cout<<Frisky.GetAge()<<" years old.\n";

Frisky.Meow();

return 0;

}

__________________________________________________________________

РЕЗУЛЬТАТ

Meow.

Frisky is a cat who is 5 years old.

Meow.

АНАЛИЗ

Метод GetAge() не принимает никаких аргументов и возвращает целочисленное значение. Реализация функции GetAge() занимает только одну строку, в которой она возвращает значение переменной-члена itsAge. Функция main() не может обратиться к этой переменной, поскольку она объявлена закрытой. Но из функции main() можно обратиться к открытому методу GetAge(), а поскольку он является функцией-членом класса Cat, то имеет все права доступа к переменной-члену itsAge. В результате функция GetAge() возвращает значение переменной itsAge в функцию main().

Функция-член SetAge() получает целочисленный параметр и присваивает его переменной itsAge. Являясь членом класса Cat, функция SetAge() имеет прямой доступ к переменной-члену itsAge.

Как можно заметить метод Meow() объявлен точно так же, как и функции доступа.

В теле основной программы main() переменной-члену itsAge с помощью метода доступа SetAge() присваивается значение 5. Обратите внимание, что при вызове метода указывается имя объекта Frisky, за которым следуют оператор прямого доступа (.) и имя самого метода SetAge(). Таким же образом можно вызывать и другие методы класса.

Если объявить метод класса как const (константа), то он не сможет изменить значение ни одного члена класса. Чтобы объявить метод класса как постоянный, нужно поместить ключевое слово const после круглых скобок, но перед точкой с запятой. Например, объявление постоянной функции-члена SomeFunction(), не получающей никаких аргументов и ничего не возвращающей, выглядит так: void SomeFunction() const;

Класс имеет две функции доступа SetAge() и GetAge(). Функция SetAge() не может быть объявлена как постоянная, поскольку она изменяет значение переменной члена itsAge. А вот функция GetAge() вполне может и даже должна быть объявлена как постоянная, поскольку она ничего не изменяет в классе. Использовать ключевое слово const в объявлениях методов, не изменяющих объект, считается хорошим тоном в программировании.