Для программистов и опытных пользователей




Скачать 4.44 Mb.
Название Для программистов и опытных пользователей
страница 7/32
Дата публикации 20.09.2014
Размер 4.44 Mb.
Тип Документы
literature-edu.ru > Авто-обзор > Документы
1   2   3   4   5   6   7   8   9   10   ...   32

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++





class myclass {







int a;







public:







myclass (intx} ; //

конструктор




int get ( } ; it







myclass: :myclass(int x) i







i a = x;







)

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)
1   2   3   4   5   6   7   8   9   10   ...   32

Похожие:

Для программистов и опытных пользователей icon П равила пользования услугами информационно-библиотечного центра
Правила пользования услугами информационно-библиотечного центра – документ, фиксирующий взаимоотношения пользователя с информационно-библиотечным...
Для программистов и опытных пользователей icon Ханк Рейнвотер Как пасти котов. Наставление для программистов, руководящих...
Посвящается Дэвиду, моему любимому сыну, память о тебе меня неизменно вдохновляет
Для программистов и опытных пользователей icon Дипломная работа
Степень удовлетворенности пользователей в документах по музыкальному искусству 25
Для программистов и опытных пользователей icon Задача учителя-методиста в современной школе научить созданию новых...
Созданы педагогические папки-копилки таких учителей как Ухмусултанова А. С., Нурмагомедова Н. Д., Яшувова А. М., Карамурзаева Б....
Для программистов и опытных пользователей icon Форм массовой работы
Традиционные и инновационные, серьезные и игровые формы массового формирования информационной культуры пользователей
Для программистов и опытных пользователей icon «Поддержка дистанционных олимпиад: новые идеи и технологии»
В данных тезисах рассматривается вопрос быстрого и удобного создания сайтов олимпиад с помощью типового сайта поддержки олимпиад,...
Для программистов и опытных пользователей icon Флот в первой половине XIX века Император Павел I и военно-морские силы
Поэтому флот России, пользовавшийся в конце XVIII века заслуженной славой и состоявший из опытных и смелых моряков, вместе с тем...
Для программистов и опытных пользователей icon Приказ №50/3 от 30. 08. 2013г. Анализ работы библиотеки мкоу «Трусовская...
В библиотеке образовательного учреждения художественной литературы насчитывается 3703 экземпляра, учебной 1588, электронных изданий...
Для программистов и опытных пользователей icon Реферат Дипломный проект посвящен модернизации локальной сети организации «Надежный Контакт»
Проанализирован список задач решаемых с помощью локальной сети; также были изучены аппаратные и программные средства, необходимые...
Для программистов и опытных пользователей icon Курсовая работа студента 342 группы Матвеева Н. Н. «Реализация отмены/повтора...
Средств разработчиков и проектировщиков по можно отдельно выделить так называемые case-средства (case computer-Aided Software Engineering)....
Литература


При копировании материала укажите ссылку © 2015
контакты
literature-edu.ru
Поиск на сайте

Главная страница  Литература  Доклады  Рефераты  Курсовая работа  Лекции