Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Основные теоретические сведения. Класс можно определить с помощью конструкции




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

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

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

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

· служебное слово - class;

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

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

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

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

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

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

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

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

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

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

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

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

class NullType {}; //пустой класс

class Fraction

{

int num;

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

public:

void reduce(); //метод - открыт

};

class XXX

{

int yyy(); //поле - закрыто

public:

int fff(int t); //метод - открыт

int RRR; //поле - открыто

};

class Money

{

private:

double Rubls;

public:

void Add(const double &r);

void Display();

};

class Date

{

int month, day, year; // поля - месяц, день, год

public:

void set(int d, int m, int y); //метод - установить дату

void get(int &d, int &m, int &y); //метод - получить дату

void next(); // метод - установить следующую дату

void print(); // метод - показать дату

};

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

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

имя_класса имя_объекта; // скалярный объект

имя_класса *имя_объекта; // указатель

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

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

NullType a, *pb; // скалярный объект и указатель

Date *pd; // указатель

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

Money *p; // указатель

Money m[100]; // массив объектов

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

Money x = t; //инициализация переменной

Date y(d); //инициализация переменной

Date &u = y; //обязательная инициализация ссылки

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

class Person

{ public: string Fio; double summa; };

Person Kunaev = { "Kупаев H.”, 10000.00 };

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

Money *pt = new Money, *pp = pt, *ps;//объявление указателей

ps = new Money; //и создание объектов

Date *pd = new Date(), *pr; //объявление указателей

pr = new Date(); //и создание объектов

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

class Count

{

Money Summa; // сумма счета

unsigned long NumberCount; // номер счета

Date D; // дата открытия счета

public:

void Display(); // вывод на экран

};

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

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

Money AddMoney(const Money &a, const Money &b); //по константной ссылке

Money Init(const long double &r); //возврат значения

void f1(Date t); //по значению

void f2(Date &t); //по ссылке

void f3(Date *t); //по указателю

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

Money t = Init(200.56);

Money r = AddMoney(x, y);

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

const Money k = p;

const Date d(t);

сonst Money t = Init(200.50);

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

объект.поле

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

Вызов открытых методов осуществляется аналогично

объект.метод(параметры)

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

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

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

Аналогично выполняется и вызов метода для элемента массива

имя_массива[индекс].метод(аргументы)

Примеры:

Date d;

d.day = 21; d.month = 11; d.year = 2013;

d.print();

d.set(22, 2, 2013);

Date DD[3]; DD[0].day = 12;

DD[0].next();

Library t;

int a = t.function(5);

Library *pt = new Library;

int b = pt->function(5);

Count A[5]; //объявление массива

for(int i = 0; i < 5; i++)

A[i].Display();

Определение размера выделяемой объектам памяти (в байтах) выполняется операцией sizeof(имя_класса). Методы не занимают место в классе. Даже пустой класс занимает некоторое количество памяти.

Определение методов класса

Методы класса имеют неограниченный доступ ко всем элементам класса независимо ни от порядка объявления элементов класса, ни от спецификаторов доступа. Методы могут определяться как внутри класса, так и вне его. Определение метода внутри класса не отличается от определения обычной функции. Метод, определенный внутри класса, считается по умолчанию встроенной функцией (inline).

Если метод определяется вне класса, то принадлежность метода классу указывается префиксом-именем класса. В классе присутствует только прототип. Метод, определенный вне класса, по умолчанию не считается inline-функцией. Методы могут быть перегружены и могут принимать аргументы по умолчанию. Аргументом и/или возвращаемым значением метода может быть объект того же класса, и такие объекты разрешено объявлять внутри метода.

 

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

time t;

t.settime(12.54);

Метод неявно получает в качестве аргумента указатель на объект, для которого он вызван. Этот указатель обозначается зарезервированным словом this и может использоваться в теле метода. Через него же разумно осуществлять доступ к полям и методам класса в случае неоднозначности (совпадение имен).

this->Summa;

Запись this представляет собой значение текущего объекта. Часто это значение используется для возврата значения определяемого класса.

Методы могут быть перегружены. Перегрузка методов — это одно из проявлений принципа полиморфизма.

Методы могут быть константными. Константный метод не изменяет значения полей класса. Константный метод объявляется при указании слова const после списка аргументов метода. Константные и неконстантные методы не являются эквивалентным и, даже если у них полностью совпадают прототипы (кроме слова const после списка аргументов). Для объекта-константы может быть вызван только константный метод. Для объекта-переменной можно вызывать как константные, так и неконстантные методы.

Для ввода значений нового типа обычно реализуется метод Read(). В простейшем виде выполняется заполнение полей нового класса из стандартного потока ввода cin с клавиатуры. В методе перед вводом каждого значения можно вывести подсказку-приглашение, объясняющую очередность набора. Передаваемые значения обычно проверяются на допустимость.

Для вывода значений нового типа реализуется метод Display(). В самом простом случае он представляет собой вывод из полей нового класса на экран — в стандартный поток cout. Метод вывода обычно реализуется как константный (см. листинг 1.2).




Поделиться с друзьями:


Дата добавления: 2015-05-10; Просмотров: 522; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.029 сек.