Читаем Освой самостоятельно С++ за 21 день. полностью

Cat Frisky; // это определение аналогично int x;

Frisky.itsAge = 5; // это присвоение аналогично x = 5;


Что объявишь, то и будешь иметь

Представьте себе, что вы гуляете со своим трехлетним ребенком, показываете ему кошку и говорите: "Это Фриски, чудесная кошка, ну-ка Фриски, залай". Даже маленький ребенок рассмеется и скажет: "Нет, кошки не умеют лаять". Если вы запишете:


Cat Frisky; // создаем кошку (объект) no имени Frisky

Frisky.Bark; // велим Frisky залаять


то компилятор тоже сообщит вам, что даже виртуальные кошки лаять не умеют, поскольку для них не объявлен такой метод. В классе Cat есть метод Meow (мяукать). Если же вы не определите в классе Cat метод Meow, то компилятор не позволит вашей кошке даже мяукать.


Рекомендуется:Используйте ключевое слово class для объявления класса. Используйте оператор прямого доступа (.) для получения доступа к переменным-членам и методам класса.


Не рекомендуется:Не путайте объявление с определением. Объявление заявляет о существовании класса, а определение резервирует память для объекта. Не путайте класс с объектом. Не присваивайте значения классу. Присваивайте значения переменным-членам объекта.

Ограничение доступа к членам класса

В объявлении класса используются и другие ключевые слова. Двумя самыми важными из них являются public (открытый) и private (закрытый), определяющие доступ к членам класса.

Все члены класса — данные и методы — являются закрытыми по умолчанию. К закрытым членам можно получить доступ только с помощью методов самого класса. Открытые члены доступны для всех других функций программы. Определение доступа

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


class Cat {

unsigned int itsAge; unsigned int itsWeight; void Meow;

};


В этом объявлении переменные itsAge и itsWeight, а также метод Meow являются закрытыми, поскольку все члены класса закрытые по умолчанию. Если требуется изменить доступ к членам класса, то это следует сделать явно.

Если в программе будет описан класс Cat, как показано выше, то обращение к переменной-члену itsAge из функции main вызовет ошибку компиляции:


Cat Boots;

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


И в самом деле, сначала компилятору указывается, что члены itsAge, itsWeight и Meow можно использовать только внутри класса Cat, а затем делается попытка использовать во внешней функции переменную-член itsAge, безраздельно принадлежащую объекту Boots класса Cat. Хотя объект Boots реально существует в программе, это не означает, что можно получать доступ к членам данного объекта, закрытым для постороннего глаза.

Именно эти моменты с определением доступа к членам класса служат источником бесконечных недоразумений у начинающих программистов. Я прямо-таки слышу ваш удивленный вопрос: "Если в программе объявлен реальный объект Boots класса Cat, почему же нельзя присвоить значение переменной-члену этого объекта, даже обратившись к ней с помощью оператора прямого доступа?"

Дело в Том, что в объявлении класса Cat ничего не говорится о ваших правах обращаться к членам этого класса, а это значит, что вы таких прав не имеете. Только собственные методы объекта Boots всегда имеют доступ ко всем данным класса, как открытым, так и закрытым. Даже несмотря на то, что вы сами создали класс Cat, это не дает вам права возвращать или изменять в программе его данные, которые являются закрытыми.

Однако из любого положения есть выход. Чтобы получить доступ к переменным- членам класса Cat, откройте их следующим способом:


class Cat {

public:

unsigned int itsAge; unsigned int itsWeight; void Meow;

};


Теперь благодаря ключевому слову public все члены класса (itsAge, itsWeight и Meow) стали открытыми.

В листинге 8.1 показано объявление класса Cat с открытыми переменными-членами.

Листинг 8.1. Доступ к открытым членам простого класса

1: // Пример объявление класса с

2: // открытыми членами

3:

4: #include // для использования cout

5:

6: class Cat // объявляем класс

7: {

8:    public: // следующие члены являются открытыми

9:    int itsAge;

10:   int itsWeight;

11: };

12:

13:

14: int main

15: {

16:    Cat Frisky;

17:    Frisky.itsAge =5; // присваиваем значение переменной-члену

18:    cout << "Frisky is а cat who is ";

19:    cout << Frisky.itsAge << " years old.\n";

20:    return 0;

21: }


Результат:

Frisky is а cat who is 5 years old.


Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT