Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4,№5.pdf
Скачиваний:
107
Добавлен:
11.02.2015
Размер:
1.13 Mб
Скачать

Основы создания программ в Си

Page 14 of 58

Классы и объекты

В рамках данной темы изучаются техника программирования нового типа данных (определение класса), использование объектов определяемого типа. Рассматриваются различные варианты сочетаний классов с другими классами и объектами, в том числе механизм композиции и механизм вложенных классов.

Краткие сведения по теме

Помимо определения новых операций с помощью конструкции функции, в C++ можно определить и новый тип данных посредством конструкции класса. Класс в C++ — это структурированный тип, образованный на основе уже существующих типов. В этом смысле класс является расширением понятия структуры.

Определение класса

Класс можно определить с помощью конструкции

тип_класса имя_класса { элементы наполнения класса };

Точка с запятой в конце ставится обязательно. В этом определении:

тип класса — одно из служебных слов class, struct, union1;

имя класса — идентификатор;

элементы наполнения класса — определения и объявления данных и принадлежащих классу функций.

Имя класса является по умолчанию именем типа объектов. Данные — это поля объекта, образующие его структуру. Значения полей определяют состояние объекта. Функция, являющаяся компонентом класса, называется методом класса. Методами класса определяются операции над объектами класса. Разрешается определять класс:

с полями и методами;

только с полями;

только с методами;

без полей и без методов.

Класс без полей и без методов называется пустым классом.

Элементы класса типа struct по умолчанию открыты и доступны в других частях программы. Члены класса class по умолчанию закрыты и недоступны вне данного класса. Доступ к содержимому класса задается спецификаторами доступа, которые обозначаются ключевыми словами public и private. Ключевое слово public объявляет элемент класса доступным вне класса, а ключевое слово private закрывает доступ снаружи. После ключевого слова требуется поставить знак «:» (двоеточие).

И в классе, и в структуре можно написать столько спецификаторов public и private, сколько необходимо, и в том порядке, в каком требуется. Очередной спецификатор действует до

Основы создания программ в Си

Page 15 of 58

следующего. Допускается индивидуально объявлять каждый элемент класса либо открытым, либо закрытым. Открытая часть класса называется интерфейсом. Сокрытие информации о внутренней структуре — это один из принципов объектно-ориентированного программирования, так называемая инкапсуляция.

Примеры объявлений классов приведены в листинге 1.1.

Листинг 1.1. Примеры объявлений классов

class Null Type {};

//

 

пустой

класс

struct Empty {};

//

 

пустой

класс struct Pair

{ int first; double second; };

//

 

только

поля - открыты

struct date

//

и поля

и методы - открыты

{ int month,day,year;

//

поля: месяц, день, год

void set(int d, int m, int у);

 

// метод - установить дату

void getCint &d, int &m, int &y):

 

//

метод - получить дату

void next();

//

метод - установить следующую дату

void print();

//

метод - показать дату

};

 

struct Money

 

{ void Add(const long &r);

// методы - открыты

void Display();

 

private:

 

long Rubls;

// поле - закрыто

};

 

class Fraction

 

{

 

int num; int denum;

// поля - закрыты

public:

 

void reduce();

// метод - открыт

};

 

class XXX

 

{ int yyy();

// метод - закрыт

public:

 

int fff(int t);

// метод - открыт

int RRR;

// поле - открыто

};

 

class Library

// только открытые методы

{

 

public: void function();

 

public: int Function(int);

 

};

 

Основы создания программ в Си

Page 16 of 58

Использование класса

Имея определение класса, можно объявлять переменные типа «имякласса». Переменная класса называется объектом, или экземпляром класса. Класс объявляется один раз, а вот объектов можно создать столько, сколько необходимо. Объекты объявляются аналогично переменным встроенного типа:

имя_класса имя_объекта;

// скалярный объект

имя_класса *имя_объекта;

// указатель

имя_класса имя_объекта[количество];

// массив объектов класса

При объявлении переменных можно задавать ключевые слова class и struct:

class имя_класса имя_объекта;

// скалярный объект

class имя_класса *имя_объекта;

// указатель

struct имя_класса имя_объекта[количество];

// массив

Разрешается совмещать определение класса и объявление переменной:

class имя_класса { члены_класса } имя_объекта;

// объект

class имя_класса { члены_класса } *имя_объекта;

// указатель

struct имя_класса { члены_класса }

 

имя_объекта[количество];

// массива элементов структуры

Эти переменные получают тип «имякласса». Тогда в дальнейшем можно объявлять переменные без записи определения класса и без служебных слов cl ass или struct, как показано выше. Объявленные переменные подчиняются правилам видимости, как и переменные встроенных типов, и время их жизни зависит от места объявления.

Следующие переменные могут быть объявлены для приведенных в листинге 1.1 классов:

NullType a. *pb;

// скалярная переменная и указатель

Empty d[10];

// массив

date *pd;

// указатель

class Money t;

// скалярная переменная

class Money *p;

// указатель

class Money m[100];

// массив

XXX YYY;

// скалярная переменная

Library L[10], *pl;

// массив и указатель

class Class { /*... */ }

// определение класса

vl. v2[20];

// скалярная переменная и массив

 

 

Переменным vl и v2 присваивается тип Cl ass, после чего для объявления других переменных достаточно указания типа Class, например

Основы создания программ в Си

Page 17 of 58

 

 

 

Class v3, v4[10];

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

Money х = t;

// инициализация переменной

date

y(d);

//

инициализация переменной

date

&u = у;

//

обязательная инициализация ссылки

 

 

 

 

Если поля открыты, разрешается обычная инициализация полей инициализатором структуры, например:

class Person

{

public:

string Fio;

double Summa;

};

Person Kupaev = {"Купаев M”, 10000.00 };

Указатели могут быть инициализированы так же, как и указатели на переменные встроенных типов:

Money *pt = new Money,*pp =

pt,*ps; //

обьявление указателей

ps = new TMoney;

//

и создание объектов

date *pd = new date(), *pr;

//

обьявление указателей

pr = new date();

//

и создание объектов

 

 

 

 

Форма со скобками после типа выполняет обнуление полей динамического объекта.

Объекты класса разрешается определять в качестве полей другого класса:

class Count

 

 

{

 

 

Money Summa;

// сумма на счете

unsigned long NumberCount;

//

номер счета

date D;

//

дата открытия счета

public:

 

void Display();

// вывод на экран

};

 

Использование объекта в качестве поля другого класса называется композицией.

Объекты класса можно передавать в качестве аргументов любыми способами (по значению, по ссылке, по указателю) и получать как результат из функции:

Основы создания программ в Си

Page 18 of 58

 

 

 

Money AddMoney(const Money &a, const Money &b);

// по константной ссылке

Money Init(const long double &r);

// возврат значения

void fKdate t);

//

по значению

void f2(date &t);

//по ссылке

void f3(date *t):

//

по указателю

 

 

 

Функция, возвращающая объект класса, может быть использована для инициализации переменной класса:

Money p = Init(200.56);

Money r = AddMoney(x, y):

Можно объявлять объекты-константы класса с обязательной инициализацией:

const Money k = р;

const date d(t);

const Money t = Init(200.50);

Доступ к открытым полям выполняется обычными для структуры способами:

объект.поле указатель->поле

Вызов открытых методов осуществляется аналогично объект.метод(параметры)

указатель->метод(параметры)

Для массива объектов обращение к открытому полю выполняется так:

имя_массива[индекс].поле

Аналогично выполняется и вызов метода для элемента массива имя_массива[индекс].метод(аргументы)

Примеры:

date d; d.day = 21; d.month = 11;

d.year = 2006; d.print(); d.set(22,2,1953); date DD[3]; DD[0].day = 12;