Скачать 4.44 Mb.
|
1. Ниже приведена программа, которая определяет общий базовый класс fruit, некоторые характеристики фруктов. Этот класс наследуется производными классами Apple и Orange. Эти классы содержат специ-информацию о конкретном фрукте (яблоке или апельсине). // Пример наследования классов ^include ttinclude using namespace std; enum yn (no, yes}; enum color {red, yellow, green, orange}; void out (enumyn x) ; char *c[ ] = { "red", "yellow", "green", "orange"}; II Родовой класс фруктов class fruit { // В этом базовом классе все элементы открыты public: enum yn annual; enum yn perennial; enum yn tree; enum yn tropical ; enum color clr; char name [40] ; >; // Производный класс яблок class Apple: public fruit { enurn yn cooking; enum yn crunchy; enum yn eating; public: void seta (char *n, enum color c, enum yn ck, enum yn crchy, enum yn e) ; void showf) ; // Производный класс апельсинов class Orange: public fruit ( enum yn juice; Глава 2, Введение в классы _ 67 епшп yn sour; enum yn eating; public: void seto(char *n, enum color c, enum yn j , enum yn sr, enum yn e) ; void show ( ) ; void Apple: :seta (char *n, enum color c, enum yn ck, enum yn crchy, enum yn e) { strcpy(name, n) ; annual = no; perennial = yes; tree = yes; tropical = no; clr = c; cooking = ck; crunchy = crchy; eat ing = e; void Orange: :seto(char *n, enum color c, enum yn j, enum yn sr, enum yn e) r strcpy (name, n} ; annual = no; perennial = yes; tree = yes; tropical = yes; clr = c; juice = j; sour = sr; eat ing = e; void Apple: :show() { cout « name « " яблоко — это: cout « "Однолетнее растение: "; out {annual} ; cout « "Многолетнее растение: "; out (perennial) ; cout « "Дерево: "; out (tree); cout « "Тропическое: "; out (tropical) ; cout « "Цвет: " « c [clr] « "\n"; cout « "Легко приготавливается: "; out (cooking) ; cout « "Хрустит на зубах: "; out (crunchy) ; cout « "Съедобное: "; out (eating); cout « "\n"; i C++ void Orange : : show{ ) { cout « name « " апельсин — это: cout « "Однолетнее растение: "; out (annual); cout « "Многолетнее растение: "; out (perennial) ; cout « "Дерево: "; out (tree); cout « "Тропическое: "; out (tropical); cout « "Цвет: " « c[clr] « "\n"; cout « "Годится для приготовления сока: "; out(juice); cout « "Кислый: "; out (sour) ; cout « "Съедобный: "; out (eating); cout « "\n"; void out{enum yn x) { if (x==no) cout « "нет\п"; else cout « "да\п"; :■ int main() { Apple al, a2; Orange ol, o2; al . seta("Краснаяпрелесть", red, no, yes, yes); a2. seta ("Джонатан", red, yes, no, yes) ; ol. setoC'nyn", orange, no, no, yes); o2.seto ("Валенсия", orange, yes, yes, no); al .show() ; a2.show() ; 01.show{) ; 02.show() ; return 0; Как можно заметить, базовый класс fruit определяет несколько свойств, характерных для фруктов любого типа, (Конечно, чтобы сократить пример и таким образом приспособить его для книги, класс fruit отчасти упрощен.) Например, все фрукты растут на однолетних или многолетних растениях. Все фрукты растут на деревьях или на растениях другого типа, таких как лоза или куст. Все фрукты имеют цвет и название. Затем такой базовый класс наследуется классами Apple и Orange. Каждый из этих классов обеспечивает объект информацией, характерной для фруктов конкретного типа. Этот пример иллюстрирует основной смысл наследования. Создаваемый здесь базовый класс определяет основные черты, связанные со всеми фруктами. Глава 2. Введение в классы 63 Производным классам предоставляется возможность обеспечения тех характеристик, которые являются характерными в каждом конкретном случае. Эта программа раскрывает другой важный аспект наследования: производные классы не "владеют" базовым классом безраздельно. Он можетн ваться любым количеством классов. класс: class area_cl { public: double height; double width; создайте два производных класса rectangle и isosceles, которые наследуют базовый класс агеа_с1. Каждый класс должен включать в себя функцию агеа(), которая возвращает площадь соответственно прямоугольника (rectangle) и равнобедренного треугольника (isosceles). Для инициализации переменных height и width (высота и длина основания, соответственно) используйте конструктор с параметрами. 2.4. Указатели на объекты До сих пор вы осуществляли доступ к членам объекта с помощью оператора (.). Если вы работаете с объектом, то это правильно. Однако доступ к объекта можно получить также и через указатель на этот объект. В этом обычно применяется оператор стрелка (->). (Аналогичным способом оператор стрелка (->) используется при работе с указателем на структуру.) Вы объявляете указатель на объект точно так же, как и указатель на переменную любого другого типа. Задайте имя класса этого объекта, а затем имя переменной со звездочкой перед ним. Для получения адреса объекта ним необходим оператор &, точно так же, как это делается для адреса переменной другого типа. Как и для любого другого указателя, если вы инкрементируете указатель на он будет указывать на следующий объект такого же типа. :■: идимедвы 1. Простой пример использования указателя на #include using namespace std; 64 Самоучитель C++
) int myclass: : get () f return a; int main() myclass ob(120); myclass *p; // p = sob; // передача адреса ob в р cout « "Значение, получаемое через объект: cout « "\n"; cout « "Значение, получаемое через указатель : " « p->get ( } ; return 0 ; к объявление myclass *p; создает указатель на объект класса myclass. Это важно для понимания следующего положения: создание указателя на объект не создает объекта, оно создает только указатель на него. передачи адреса объекта ob в переменную р, использовалась р = sob; И последнее, в программе показано, как можно получить доступ к объекта с помощью указателя на этот объект. Мы вернемся к обсуждению указателей на объекты в главе 4, когда у вас уже более полное представление о C++. 2. Введение в классы 65 2.5. Классы, структуры и объединения Как вы уже заметили, синтаксически класс похож на структуру. Вас, возможно, удивило то, что класс и структура имеют фактически одинаковые свойства. В C++ определение структуры расширили таким образом, что туда, как и в определение класса, удалось включить функции-члены, в том числе конструкторы и деструкторы. Таким образом, единственным отличием между структурой и классом является то, что члены класса, по умолчанию, являются закрытыми, а члены структуры — открытыми. Здесь показан расширенный синтаксис описания структуры: struct имя // открытые функции и данные — «лены класса. private: // закрытие функция и данные — члены класса } списокобъектов Таким образом, в соответствии с формальным синтаксисом C++ как структура, так и класс создают новые типы данных. Обратите внимание на введение нового ключевого слова. Им является слово private, которое сообщает компилятору, что следующие за ним члены класса являются закрытыми. В том, что структуры и классы обладают фактически одинаковыми свойст-и, имеется кажущаяся избыточность. Те, кто только знакомится с C++, удивляются этому дублированию. При таком взгляде на проблему уже не кажутся необычными рассуждения о том, что ключевое слово class совершенно лишнее. Объяснение этому может быть дано в "строгой" и "мягкой" формах. "Строгий" довод состоит в том, что необходимо поддерживать линию на совместимость с С. Стиль задания структур С совершенно допустим и для программ C++. Поскольку в С все члены структур по умолчанию открыты, это положение также поддерживается и в C++. Кроме этого, поскольку класс синтаксически отличается от структуры, определение класса открыто для развития в направлении, которое в конечном итоге может привести к несовместимости со взятым из С определением структуры. Если эти два пути разойдутся, то направление, связанное с C++, уже не будет избыточным. "Мягким" доводом в пользу наличия двух сходных конструкций стало отсутствие какого-либо ущерба от расширения определения структуры в C++ таким образом, что в нее стало возможным включение функций-членов. Хотя структуры имеют схожие с классами возможности, большинство программистов ограничивают использование структур взятыми из С формами и не применяют их для задания функций-членов. Для задания объекта, содержащего данные и код, эти программисты обычно указывают ключевое слово class. Однако все это относится к стилистике и является предметом вашего собственного выбора. (Далее в книге за исключением текущего раздела с 66 Самоучитель C++ ключевого слова struct задаются объекты, которые не членов.) Если вы нашли интересной связь между классами и структурами, вас заинтересует и следующее необычное свойство C++: объединения и классы в этом языке столь же близки! В C++ объединение также представляет собой класса, в котором функции и данные могут содержаться в качестве его Объединение похоже на структуру тем, что в нем по умолчанию все открыты до тех пор, пока не указан спецификатор private. Главное же в том, что в C++ все данные, которые являются членами объединения, на-в одной и той же области памяти (точно так же, как и в С). Объе-могут содержать конструкторы и деструкторы. Объединения C++ совместимы с объединениями С. Если в отношениях между структурами и классами существует, на первый яд, некоторая избыточность, то об объединениях этого сказать нельзя. В рованном языке важна поддержка инкапсуляции, способность объединений связывать воедино программу и данные создавать такие типы классов, в которых все данные находятся в общей об-памяти. Это именно то, чего нельзя сделать с помощью классов. к C++ имеется несколько ограничений, накладываемых на использование объединений. Во-первых, они не могут наследовать какой бы то ни было класс и не могут быть базовым классом для любого другого класса. Объединения не могут иметь статических членов. Они также не должны содержать объектов с конструктором или деструктором, хотя сами по себе объединения могут иметь конструкторы и деструкторы. В C++ имеется особый тип объединения - это анонимное объединение (anonymous union). Анонимное объединение не имеет имени типа и следова-нельзя объявить переменную такого типа. Вместо этого анонимное просто сообщает компилятору, что все его члены будут находиться в одной и той же области памяти. Во всех остальных отношениях члены объединения действуют и обрабатываются как самые обычные переменные. То есть, доступ к членам анонимного объединения осуществляется непосредственно, без использования оператора точка (.). Например, рассмотрим следующий фрагмент: union { // анонимное объединение int i; char ch[4]; }; // непосредственный доступ к переменным i и ch i = 10; ch[0] = 'X'; Обратите внимание на то, что, поскольку переменные i и ch не являются какого бы то ни было объекта, доступ к ним осуществляется непо-Тем не менее они находятся в одной и той же области Глава 2. Введение в классы 67 Смысл анонимных объединений в том и состоит, что они простой способ сообщить компилятору о необходимости разместить или несколько переменных в одной и той же области памяти. Исключая эту особенность, члены анонимного объединения больше ничем не от других переменных. Все те ограничения, которые накладываются на использование объединений, применимы и к анонимным объединениям. Кроме этого к ним добавлено еще несколько. Глобальное анонимное объединение должно объявлено как статическое. Анонимное объединение не может содер-закрытых членов. Имена членов анонимного объединения не конфликтовать с другими идентификаторами той же области видимости. 1. Ниже представлена короткая программа, в которой для создания класса используется ключевое слово struct: #include ^include using namespace std; // использование структуры для определения типа класса struct st_type { st_type(double b, char *n) ; void show{) ; private: double balance; char name [40] ; t; st_type: : st_type (doubleb, char *n) |
П равила пользования услугами информационно-библиотечного центра Правила пользования услугами информационно-библиотечного центра – документ, фиксирующий взаимоотношения пользователя с информационно-библиотечным... |
Ханк Рейнвотер Как пасти котов. Наставление для программистов, руководящих... Посвящается Дэвиду, моему любимому сыну, память о тебе меня неизменно вдохновляет |
||
Дипломная работа Степень удовлетворенности пользователей в документах по музыкальному искусству 25 |
Задача учителя-методиста в современной школе научить созданию новых... Созданы педагогические папки-копилки таких учителей как Ухмусултанова А. С., Нурмагомедова Н. Д., Яшувова А. М., Карамурзаева Б.... |
||
Форм массовой работы Традиционные и инновационные, серьезные и игровые формы массового формирования информационной культуры пользователей |
«Поддержка дистанционных олимпиад: новые идеи и технологии» В данных тезисах рассматривается вопрос быстрого и удобного создания сайтов олимпиад с помощью типового сайта поддержки олимпиад,... |
||
Флот в первой половине XIX века Император Павел I и военно-морские силы Поэтому флот России, пользовавшийся в конце XVIII века заслуженной славой и состоявший из опытных и смелых моряков, вместе с тем... |
Приказ №50/3 от 30. 08. 2013г. Анализ работы библиотеки мкоу «Трусовская... В библиотеке образовательного учреждения художественной литературы насчитывается 3703 экземпляра, учебной 1588, электронных изданий... |
||
Реферат Дипломный проект посвящен модернизации локальной сети организации «Надежный Контакт» Проанализирован список задач решаемых с помощью локальной сети; также были изучены аппаратные и программные средства, необходимые... |
Курсовая работа студента 342 группы Матвеева Н. Н. «Реализация отмены/повтора... Средств разработчиков и проектировщиков по можно отдельно выделить так называемые case-средства (case computer-Aided Software Engineering).... |
Поиск на сайте Главная страница Литература Доклады Рефераты Курсовая работа Лекции |