|
Программирование >> Дополнительные возможности наследования
Опреушние объекта Объект нового типа определяется таким же способом, как и любая целочисленная переменная: unsigned int GrossWeight; определяем беззнаковое целое Cat Frisky; определяем объект Cat В этих программных строках определяется переменная с именем GrossWeight, которая имеет тип unsigned int, а также определяется объект Frisky, который является объектом класса (или имеет тип) Cat. Классы в сравнении с пбъектамн Вам никогда не придет в голову поиграть с кошкой как с абстрактным понятием, скорее вы приласкаете свою настоящую мурку. Не нужно много говорить о том, какая разницу между кошкой вообще и конкретным котом, от которого шерсть по всей комнате и царапины на ножках стульев. Точно такая же разница между классом Cat, представляющим собой некую абстракцию, и отдельным объектом класса Cat. Следовательно, Frisky - это объект типа Cat в том самом смысле, в котором GrossWeight - переменная типа unsigned int. Итак, мы пришли к тому, что объект - это отдельный экземпляр некоторого класса. Получение уоступа к членам класса После определения реального объекта класса Cat, например Frisky, у нас может возникнуть необходимость в получении доступа к членам этого объекта. Для этого используется оператор прямого доступа (.). Следовательно, чтобы присвоить число 50 переменной-члену Weight объекта Frisky, можно записать Frisky.Weight = 60; Аналогично, для вызова метода Meow() достаточно использовать следующую запись: Frisky.MeowO; Когда нужно использовать некоторый метод класса, выполняется вызов этого метода. В данном примере вызывается метод Meow() объекта Frisky. Значения присваиваются вбъвктам, а не классам В языке С++ нельзя присваивать значения типам данных, они присваиваются только переменным. Например, такая запись неверна: int = 5; неверно Компилятор расценит это как ошибку, поскольку нельзя присваивать число типу int. Вместо этого нужно определить целочисленную переменную и присвоить число 5 этой переменной. Например: int х; определяем х как переменную типа int X = 5; присвоение переменной х значения 5 Таким образом, число 5 присваивается переменной х, которая имеет тип int. тех же соображений недопустима следующая запись: Cat.itsAge=5; ??? неверно Если Cat - это класс, а не объект, то компилятор отметит это выражение как ощи-бочное, поскольку нельзя присвоить число 5 переменной itsAge класса (т.е. типа) Cat. Вместо этого нужно определить объект класса Cat и присвоить число 5 соответствующей переменной-члену этого объекта. Например: Cat Frisky; Frisky.itsAge = 5; это определение аналогично int х; это присвоение аналогично х = 5; Что оОъявить, то о Оудеть иметь Представьте себе, что вы гуляете со своим трехлетним ребенком, показываете ему кошку и говорите: Это Фриски, чудесная кошка, ну-ка Фриски, залай . Даже маленький ребенок рассмеется и скажет: Нет, кошки не умеют лаять . Если вы запишете: Cat Frisky; создаем кошку (объект) по имени Frisky Frisky.ВагкО; велим Frisky залаять то компилятор тоже сообщит вам, что даже виртуальные кошки лаять не умеют, поскольку для них не объявлен такой метод. В классе Cat есть метод Meow() (мяукать). Если же вы не определите в классе Cat метод MeowO, то компилятор не позволит вашей кошке даже мяукать. Рекомендуется Используйте ключевое слово class для объявления класса. Используйте оператор прямого доступа ,(.) для получения доступа к переменным-членам и методам класса. Не рекомендуется Не путайте объявление с определением. Объявление заявляет о существовании класса, а определение резервирует память для объекта. Не путайте класс с объектом. Не присваивайте значения классу. Присваивайте значения переменным-членам объекта. Ограничение доступа к членам класса В объявлении класса используются и другие ключевые слова. Двумя самыми важными из них являются public (открытый) и private (закрытый), определяющие доступ к членам класса. Все члены класса - данные и методы - являются закрытыми по умолчанию. К закрытым членам можно получить доступ только с помощью методов самого класса. Открытые члены доступны для всех других функций программы. Определение доступа к членам класса имеет очень важное значение, и именно при решении этой задачи начинающие профаммисты часто сталкиваются с трудностями. Чтобы прояснить ситуацию, рассмотрим пример, который уже приводился выше в этой главе: class Cat { unsigned int itsAge; unsigned int itsWeight; void MeowO; В этом объявлении переменные itsAge и itsWeight, а также метод MeowO являются закрытыми, поскольку все члены класса закрытые по умолчанию. Если требуется изменить доступ к членам класса, то это следует сделать явно. Если в профамме будет описан класс Cat, как показано выше, то обращение к переменной-члену itsAge из функции mainO вызовет ошибку компиляции: Cat Boots; Boots.itsAge = 5; Ошибка! Нельзя обращаться к закрытым данным И в самом деле, сначала компилятору указывается, что члены itsAge, itsWeight и MeowO можно использовать только внутри класса Cat, а затем делается попытка использовать во внешней функции переменную-член itsAge, безраздельно принадлежащую объекту Boots класса Cat. Хотя объект Boots реально существует в профамме, это не означает, что можно получать доступ к членам данного объекта, закрытым для постороннего глаза. Именно эти моменты с определением доступа к членам класса служат источником бесконечных недоразумений у начинающих профаммистов. Я прямо-таки слышу ваш удивленный вопрос: Если в программе объявлен реальный объект Boots класса Cat, почему же нельзя присвоить значение переменной-члену этого объекта, даже обратившись к ней с помощью оператора прямого доступа? Дело в Том, что в объявлении класса Cat ничего не говорится о ваших правах обращаться к членам этого класса, а это значит, что вы таких прав не имеете. Только собственные методы объекта Boots всегда имеют доступ ко всем данным класса, как открьгтым, так и закрытым. Даже несмотря на то что вы сами создали класс Cat, это не дает вам права возвращать или изменять в профамме его данные, которые являются закрытыми. Однако из любого положения есть выход. Чтобы получить доступ к переменным-членам класса Cat, откройте их следующим способом: class Cat < public: unsigned int itsAge; unsigned int itsWeight; void MeowO; Теперь благодаря ключевому слову public все члены класса (itsAge, ItsWeight и MeowO) стали открытыми. В листинге 6.1 показано объявление класса Cat с открытыми переменными-членами.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |