И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина





НазваниеИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина
страница12/32
Дата публикации01.09.2013
Размер1.4 Mb.
ТипЛекция
100-bal.ru > Информатика > Лекция
1   ...   8   9   10   11   12   13   14   15   ...   32

5. Объявление класса в языке Си++

5.1 Синтаксис объявления класса


Интерфейсная часть класса располагается в заголовочном файле с расширением "*.h", а реализация – в файле с расширением "*.cpp". В одном заголовочном файле могут находиться описания нескольких классов, но обычно так бывает только если классы тесно связаны.

Объявление класса начинается со служебного слова class (см. фрагмент программы 3.1). Описание класса очень похоже на описание структуры, только вместе с полями данных стоят заголовки функций. Служебное слово private: предшествует фрагментам кода, доступ к которым разрешен только изнутри самого класса (закрытая часть описания класса). Служебное слово public: обозначает открытую интерфейсную часть класса, доступную его пользователям. То, что в интерфейсном файле содержится описание закрытой части класса и оно видно пользователям, является нарушением принципа Парнаса. Так приходится поступать, поскольку компилятору требуется знать, сколько памяти требуется для объекта класса, а это можно определить, только если известен размер всех переменных-атрибутов – и общедоступных, и закрытых.

В терминологии Си++ атрибуты класса называются переменными-членами класса, а методы – функциями-членами класса.
// Константы для обозначения карточной масти

enum Suit { Heart /* черви */, Club /* трефы */,

Diamond /* бубновая масть */, Spade /* пики */ };

// Константы для обозначения цвета карт

enum Color { Red, Black };
class CCard {

public:

// Конструктор

CCard( Suit, int );

// Доступ к атрибутам карты

Color GetColor();

bool IsFaceUp();

int GetRank();

Suit GetSuit();

// Выполняемые картой действия

void Draw( CWindow& wnd, int x0, int y0 );

void Erase( CWindow& wnd );

void Flip();
private:

bool isFaceUp; // Состояние "картинка вверх"/"картинка вниз"

int rank; // Ранг карты

Suit suit; // Масть карты

};

Фрагмент программы 3.1. Описание класса CCard (хранится в файле card.h).
Пользователи чаще интересуются открытой областью класса, поэтому в описании она должна идти первой. Чтобы сделать описание более читаемым, надо использовать комментарии, табуляцию, группирование атрибутов и функций-членов по смыслу.

Метод CCard(Suit, int) является в нескольких отношениях особенным. У этого метода имя совпадает с именем класса, и у него нет возвращаемого значения. Этот метод называется конструктором класса. Он используется для инициализации создаваемых объектов класса (конструкторы будут рассматриваться позже).

Методу Draw() в качестве параметра передается ссылка на некий класс CWindow, описывающий окно, в котором надо выполнить рисование карты. Классы обычно передаются по ссылке, а не по значению, т.к. имеют значительный размер.

Атрибуты и функции-члены не могут иметь одинаковых имен. Поэтому переменная для хранения масти карты имеет имя suit, а функция-член для получения этого значения – имя GetSuit. Аналогично, имена rank и GetRank нужны для хранения и получения ранга карты.

Файл реализации для класса CCard должен обеспечить работу методов, описанных в интерфейсном файле. Начало файла реализации для класса CCard показано во фрагменте программы 3.2.
#include "card.h"
CCard::CCard( Suit sv, int rv )

{

suit = sv;

rank = rv;

isFaceUp = true;

}
int CCard::GetRank()

{

return rank;

}
Color CCard::GetColor()

{

return (Color)( suit % 2 ); // Очень плохой способ реализации

}

Фрагмент программы 3.2. Файл реализации класса CCard (card.cpp).
Тело функции-члена записывается как обычная функция Си++, но имени функции-члена предшествует имя класса и два двоеточия. На атрибуты класса внутри функций-членов можно ссылаться как на обычные переменные. Комбинация имени класса и имени функции-члена образует полное имя функции-члена. Его можно рассматривать как аналоги имени и фамилии при идентификации личности.

5.2 Встраиваемые функции


Очень короткие функции, в которых нет ни условных операторов, ни циклов, в Си++ можно определить как встраиваемые. Синтаксически обращение к встраиваемой функции выглядит совершенно аналогично обращению к обычной функции. Единственная разница состоит в том, что компилятор имеет право (но не обязан) преобразовать вызов встраиваемой функции непосредственно в код в точке ее вызова, сокращая тем самым расходы на обращение к функции и возврат управления. Например, обращение к функции, состоящей из единственного оператора return, может занять больше времени, чем выполнение этого оператора. Встраиваемые функции позволяют избежать подобной проблемы. Для определения встраиваемой функции или функции-члена применяется служебное слово inline:
inline int CCard::GetRank()

{

return rank;

}
Встраиваемые функции-члены можно записывать непосредственно в описании класса, как показано во фрагменте 3.3. При интенсивном использовании встраиваемых функций вполне реально, что файл реализации окажется короче файла с интерфейсом. Однако при таком подходе определение класса становится более трудным для чтения и поэтому должно использоваться только тогда, когда функций-членов немного, а их код очень короткий.
class CCard {

public:

// Конструкторы

CCard( Suit, int );

CCard();

CCard( const CCard& );
// Доступ к атрибутам карты

Color GetColor();

bool IsFaceUp() { return isFaceUp; }

int GetRank() { return rank; }

Suit GetSuit() { return suit; }

// Выполняемые картой действия

void Draw( CWindow& wnd, int x0, int y0 );

void Erase( CWindow& wnd );

void Flip() { isFaceUp = !isFaceUp; }
private:

bool isFaceUp; // Состояние "картинка вверх"/"картинка вниз"

int rank; // Ранг карты

Suit suit; // Масть карты

};

Фрагмент программы 3.3. Описание класса CCard с применением встраиваемых функций.

5.3 Полиморфизм методов


Полиморфизм (polymorphism) – это свойство, которое позволяет одно и то же имя использовать для решения нескольких схожих, но технически (на уровне реализации) разных задач. В Си++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций. Перегруженные функции отличаются друг от друга количеством и типом параметров. Компилятор организует вызов соответствующей функции после анализа количества и типов переданных параметров.

Например, в классе CCard можно предусмотреть две функции для рисования карты, которые различаются способом указания левого верхнего угла карты: или двумя отдельными значениями координат, или с помощью объекта класса CPoint:
class CCard {

public:

...

void Draw( CWindow& wnd, int x0, int y0 );

void Draw( CWindow& wnd, CPoint& topLeft );

...

};
Перегруженные имена функций – это, главным образом, удобство записи. Оно имеет большое значение для функций с общепринятыми именами вроде print и open. При вызове функции f компилятор должен понять, к какой из функций с именем f следует обратиться. Для этого типы всех фактических параметров сравниваются с типами формальных параметров всех функций с именем f. В результате вызывается функция, которая лучше всего совпадает с параметрами, или выдается ошибка во время компиляции, если никакая из функций не подходит.

5.4 Перегруженные операторы


Перегрузка операторов, наряду с перегрузкой функций, является проявлением полиморфизма в Си++. Фактически полиморфизм в арифметических операторах применяется почти во всех языках программирования. Например, в языке Си символ + используется для сложения целых, длинных целых, символьных переменных и чисел с плавающей точкой. В Си++ можно применять эту концепцию к любым типам данных, созданным программистом. Кроме арифметических, можно определять еще и логические операции, операции сравнения, присваивания =, вызова (), индексирования [] и разыменования ->.

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

Например, простой класс комплексного числа с операциями сложения и умножения можно объявить следующим образом:
class CComplex {

public:

CComplex( double r, double i ) { re = r; im = i; }

CComplex operator+(CComplex);

CComplex operator*(CComplex);

private:

double re, im;

};
Программист задает смысл операций + и * путем определения функций-членов класса с именами operator+ и operator*. Если, например, даны объекты b и c класса CComplex, то выражение b+c означает (по определению) вызов функции-члена b.operator+(c). Т.е. теперь есть возможность приблизиться в тексте программы к общепринятой интерпретации комплексных выражений.

В файле реализации описание оператора сложения будет выглядеть так:
CComplex CComplex::operator+(CComplex c1)

{

  return CComplex( re + c1.re, im + c1.im );

}

1   ...   8   9   10   11   12   13   14   15   ...   32

Похожие:

И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПротокол №5 От 12 января 2012 г Заседания кафедры электроники и вычислительной...
Зав кафедрой Хакимова Г. Г. сообщила, что кафедра проводит 2-й Чемпионат по цифровой схемотехнике
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМетодические рекомендации по подготовке, оформлению, предзащите и...
В. А. Усков, заместитель декана естественно-географического факультета по развитию, доцент кафедры физической географии и методики...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПроблемы коммуникации
М. Е. Евсевьева (зав кафедрой, доцент А. А. Ветошкин); С. А. Борисова, директор Института международных отношений Ульяновского государственного...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма по формированию навыков безопасного поведения на дорогах...
Елена Святославовна Симакова, кандидат педагогических наук, доцент кафедры гуманитарных и естественнонаучных дисциплин Рязанского...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма курса по выбору «Орнитология» предназначена для студентов...
Автор программы: к б н., доцент, зав кафедрой биологии и химии Марина Николаевна Харламова
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРоссийской Федерации Федеральное государственное образовательное...
Петренко И. М., зав кафедрой экономической теории, д-р экон наук профессор Дулин М. П., зав кафедрой педагогики и психологии, д-р...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРахманкулова Людмила Кузьминична, кандидат филологических наук, доцент...
Автор программы: С. А. Виноградова, кандидат филологических наук, доцент, зав кафедрой английского языка и английской филологии
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма по формированию навыков безопасного поведения на дорогах...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconЛингвистические проблемы
Московского государственного педагогического института иностранных языков им. М. Тореза (зав кафедрой доцент Ю. А. Денисенко); д-р...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМгпу учебно-методический комплекс дисциплины
А. В. Прялухина, кандидат психологических наук, доцент, зав кафедрой психологии Российского государственного социального университета...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРабочая программа по дисциплине «теория экономического анализа»
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРабочая программа по дисциплине «международный менеджмент»
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМетодические рекомендации по написанию курсовых работ дисциплине
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconУчебное пособие Краснодар 2008
В. А. Оробец); кафедра паразитологии и ветсанэкспертизы Донского государственного аграрного университета (зав кафедрой, проф., к...


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск