Г. Шилтд - Самоучитель C++ (DJVU), страница 11
Описание файла
DJVU-файл из архива "Г. Шилтд - Самоучитель C++ (DJVU)", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 11 - страница
Все фрукты имеют цвет и название. Затем такой базовый класс наследуется классами Арр)е и Огапяе. Каждый из этих классов обеспечивает объект информацией, характерной для фруктов конкретного типа. Этот пример иллюстрирует основной смысл наследования. Создаваемый здесь базовый класс определяет основные черты, связанные со всеми фруктами. сонг « сорб с< соус « сопг « сопл с< сопб « совб « пате « " апельсин — это: " « "'~п"; "Однолетнее растение: "; сии (аппаа1); "Многолетнее растение: "; опс (ретепп1а1); "Дерево: "; оп< (т.тее)у "Тропическое: "; оп" (Стор1са1); "Цвет: " « с[о1г) « "1п"; "Годится для приготовления сока; "; аШ (1п1се); "киотъй: "; опс (воат); "съедобжяй: "; оис (еасгпд); "~п"; Глава 2. Введение в классы Производным классам предоставляется возможность обеспечения тех характеристик, которые являются характерными в каждом конкретном случае.
Эта программа раскрывает другой важный аспект наследования: производные классы не "владеют" базовым классом безраздельно. Он может наследоваться любым количеством классов. ~6фбфЩИфЦ$ 1. Дан следующий базовый класс: с1авв асеа с1 1 риЬ11с: ооаЬ1е Ьетдис; ооаЬ1е нЫЬЬ; создайте два производных класса тес(ав~)е и 1аоасе1еа, которые наследуют базовый класс агеа с1. Каждый класс должен включать в себя функцию агеа(), которая возвращает площадь соответственно прямоугольника (гесгапд1е) и равнобедренного треугольника (1зозсе1ез).
Для инициализации переменных Ье(ф( и ичко(11 (высота и длина основания, соответственно) используйте конструктор с параметрами. 2.4. Указатели на объекты До сих пор вы осуществляли доступ к членам объекта с помощью оператора точка (.). Если вы работаете с объектом, то это правильно. Однако доступ к члену объекта можно получить также и через указатель на этот объект. В этом случае обычно применяется оператор стрелка (->). (Аналогичным способом оператор стрелка (->) используется при работе с указателем на структуру.) Вы объявляете указатель на объект точно так же, как и указатель на переменную любого другого типа. Задайте имя класса этого объекта, а затем имя переменной со звездочкой перед ним.
Для получения адреса объекта перед ним необходим оператор ос, точно так же, как это делается для получения адреса переменной другого типа. Как и для любого другого указателя, если вы инкрементируете указатель на объект, он будет указывать на следующий объект такого же типа. е ...а. -':! ;:!,1ПРИМЕ~~Ы; 1. Простой пример использования указателя на объект: Фьпс1ибе <1овтгеип> аеьад аатеерасе всб Самоучитель С++ с1авв п~ус1аав ( гпс а; риЬ11с: тпус1ава (ьпсх) ~ // конструктор ьпв дев () ~ ~пус1аа з:: д~ус1азв (1пс х) 1пб ~пус1азз:: Чес () теснсп а; гпс таьп() пус1ааа оЬ(120),' // создание объекта тпус1авв *р; /~ создание указателя на объект р = ЙоЬ; // передача адреса оЬ в р соус « "Значение, получаемое через объект:" « оЬ.Яее О р соне « 1п г соне « "Значение, получаемое через указатель: " « р->Че~ ( ) > севнтп О ~ Отметьте, как объявление птус)ааа "р; создает указатель на объект класса шуе!авв.
Это важно для понимания следующего положения: создание указателя на объект не создает объекта, оно создает только указатель на него. Для передачи адреса объекта оЬ в переменную р, использовалась инструкция: р= зоЬ; И последнее, в программе показано, как можно получить доступ к членам объекта с помощью указателя на этот объект. Мы вернемся к обсуждению указателей на объекты в главе 4, когда у вас уже будет более полное представление о С++.
Глава 2. Введение в классы 2.5. Классы, структуры и объединения Как вы уже заметили, синтаксически класс похож на структуру. Вас, возможно, удивило то, что класс и структура имеют фактически одинаковые свойства. В С++ определение структуры расширили таким образом, что туда, как и в определение класса, удалось включить функции-члены, в том числе конструкторы и деструкторы. Таким образом, единственным отличием между структурой и классом является то, что члены класса, по умолчанию, являются закрытыми, а члены структуры — открытыми.
Здесь показан расширенный синтаксис описания структуры: а~кисЕ иия тина откритые Функдии и данные — «лены кдаооа дтхуаей: закрытие функции и данные — члены класса ) список ооаактов Таким образом, в соответствии с формальным синтаксисом С++ как структура, так и класс создают новые типы данных. Обратите внимание на введение нового ключевого слова.
Им является слово рптате, которое сообщает компилятору, что следующие за ним члены класса являются закрытыми. В том, что структуры и классы обладают фактически одинаковыми свойствами, имеется кажущаяся избыточность. Те, кто только знакомится с С++, часто удивляются этому дублированию. При таком взгляде на проблему уже не кажутся необычными рассуждения о том, что ключевое слово с1авв совершенно лишнее. Объяснение этому может быть дано в "строгой" и "мягкой" формах.
"Строгий" довод состоит в том, что необходимо поддерживать линию на совместимость с С. Стиль задания структур С совершенно допустим и для программ С++. Поскольку в С все члены структур по умолчанию открыты, это положение также поддерживается и в С++. Кроме этого, поскольку класс синтаксически отличается от структуры, определение класса открыто для развития в направлении, которое в конечном итоге может привести к несовместимости со взятым из С определением структуры. Если эти два пути разойдутся, то направление, связанное с С++, уже не будет избыточным. "Мягким" доводом в пользу наличия двух сходных конструкций стало отсутствие какого-либо ущерба от расширения определения структуры в С++ таким образом, что в нее стало возможным включение функций-членов. Хотя структуры имеют схожие с классами возможности, большинство программистов ограничивают использование структур взятыми из С формами и не применяют их для задания функций-членов.
Для задания объекта, содержащего данные и код, эти программисты обычно указывают ключевое слово с1авв. Однако все это относится к стилистике и является предметом вашего собственного выбора. (Далее в книге за исключением текущего раздела с Самоучитель С++ помощью ключевого слова з1гцс1 задаются объекты, которые не имеют функций-членов.) Если вы нашли интересной связь между классами и структурами, вас заинтересует и следуюшее необычное свойство С++: объединения и классы в этом языке столь же близки! В С++ объединение также представляет собой тип класса, в котором функции и данные могут содержаться в качестве его членов. Объединение похоже на структуру тем, что в нем по умолчанию все члены открыты до тех пор, пока не указан спецификатор рпча1е.
Главное жс в том, что в С++ все данные, которые являются членами объединения, находятся в одной и той же области памяти (точно так же, как и в С). Объединения могут содержать конструкторы и деструкторы. Объединения С++ совместимы с объединениями С. Если в отношениях между структурами и классами существует, на первый взгляд, некоторая избыточность, то об объединениях этого сказать нельзя. В объектно-ориентированном языке важна поддержка инкапсуляции. Поэтому способность объединений связывать воедино программу и данные позволяет создавать такие типы классов, в которых все данные находятся в общей области памяти. Это именно то, чего нельзя сделать с помошью классов.
Применительно к С++ имеется несколько ограничений, накладываемых на использование объединений. Во-первых, они не могут наследовать какой бы то ни было класс и не могут быть базовым классом для любого другого класса. Объединения не могут иметь статических членов. Они также не должны содержать объектов с конструктором или деструктором, хотя сами по себе объединения могут иметь конструкторы и деструкторы. В С++ имеется особый тип объединения — это анонимное объединение ~анонутоия инта). Анонимное объединение не имеет имени типа и следовательно нельзя объявить переменную такого типа. Вместо этого анонимное объединение просто сообщает компилятору, что все его члены будут находиться в одной и той же области памяти.
Во всех остальных отношениях члены объединения действуют и обрабатываются как самые обычные переменные. То есть, доступ к членам анонимного объединения осуществляется непосредственно, без использования оператора точка (.). Например, рассмотрим следуюший фрагмент: опгоп ( // анонимное объединение 1п1 спаг сь~4); )Р ыепосредственьыя доступ к переменным 1. и сп = 1О; сй ~0) = 'Х' Обратите внимание на то, что, поскольку переменные 1 и сп не являются частью какого бы то ни было объекта, доступ к ним осуществляется непосредственно. Тем не менее они находятся в одной и той же области памяти.
Глава 2. Введение в классы 1. Ниже представлена короткая программа, в которой для создания класса используется ключевое слово атпкт: (гъпс1ис(е <ъовскеат> ()ъпс1ибе <свегтпц> иа1пя пагпеарасе аь~г // использование структуры для определения типа класса атгист ас уре ( вс суре(г(опЬ1е Ь, сйаг "п); усыпи вЬои ( ); рпауасе: г(оиЫе Ьа!апсе; с иаг пале ( 4 01; вс суре:: вг суре (с(оиЬ1еЬ, сЬап *и) ( Ьа1апсе = Ь; аскеру (пагае, и); гого вг суре::а)тон(,' сонг « "имя:" « пате; сонг « '":Ф" « Ьа1апсе; гй (Ьа1апсе < 0.0) сопЬ « "**""; соне « "~п"; 1пс лаъгг() ( вс г.уре еЬ Суре асс1(100.12, "доЬпвоп") Г асс2 (-12.