- •Лабораторная работа.4. Знакомство со средой разработки. Основы создания классов
- •Среда разработки Visual Studio 2005. Hello new word!
- •Вывод результатов компиляции и диагностики приложения
- •Инструментарий отладки Visual Studio
- •Использование точек останова
- •Контроль значений переменных при пошаговом выполнении
- •Классы и объекты
- •Краткие сведения по теме
- •Использование класса
- •Определение методов класса
- •Общее задание 1. Пример программы
- •Вложенные классы
- •Задания
- •Индивидуально задание 1: Структура-пара
- •Индивидуально задание 2: Структуры и классы
- •Требования к отчетам по лабораторной работе №4
- •Общее задание для проведения лабораторной работы:
- •Сведения по теме
- •Перегрузка операций
- •Перегрузка операций внешними функциями
- •Перегрузка операций методами класса
- •Функции-друзья класса
- •Конструкторы и деструктор
- •Конструкторы и параметры
- •Константы в классе
- •Поля-массивы в классе
- •Операция индексирования
- •Статические элементы класса
- •Подсчет объектов класса
- •Индивидуальные задания
- •Задание по теме: Конструкторы и перегрузка операций
- •Задание по теме: Массивы и константы в классе
Основы создания программ в Си |
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;
