ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 9
Тема: «Разработка простейших программ на Си++ с использованием классов»
Цели:
- определить понятие класса;
- изучить особенности создания классов в языке С++;
- определить понятие методов и свойств классов в С++;
- приобрести основные навыки написания и отладки программ в С++, с использованием классов.
Характер занятия: репродуктивный.
Форма организации: индивидуальная.
Обеспечение занятия: тетрадь с лекциями, СИ, компьютер.
Требования к знаниям студентов
Перед выполнением практической работы студент должен
знать:
- понятия объектно-ориентированного программирования;
- основные характеристики и возможности языка С++;
- особенности С++ как языка программирования;
после выполнения практической работы студент должен
уметь:
- создавать простейшие программы, с использованием классов, на языке С++;
- описывать объекты предметной области в виде классов;
- выполнять простейшие действия в визульной среде С++;
- отличать класс от объекта в С++.
|
|
Теоретический материал
Простой класс
Наш первый пример содержит класс и два объекта этого класса. Несмотря на свою простоту, он демонстрирует синтаксис и основные черты классов С++. Листинг программы SMALL0BJ приведен ниже.
// smallobj.cpp
// демонстрирует простой небольшой объект
#include <iostream>
using namespace std;
//*****************************************
class smallobj // определение класса
{
private:
int somedata; // поле класса
public:
void setdata(int d) // метод класса, изменяющий значение поля
{ somedata = d; }
void showdata() // метод класса, отображающий значение поля
{cout << "Значение поля равно " << somedata << endl; }
};
//////////////////////////////////////////////////////////
int main()
{
setlocale(LC_CTYPE, "rus");
smallobj s1, s2; // определение двух объектов класса smallobj
s1.setdata(1066); // вызовы метода setdataO
s2.setdata(1776);
s1.showdata(); // вызовы метода showdataO
s2.showdata();
return 0;
}
Класс smallobj, определенный в этой программе, содержит одно поле данных и два метода. Методы обеспечивают доступ к полю данных класса. Первый из методов присваивает полю значение, а второй метод выводит это значение на экран.
Объединение данных и функций является стержневой идеей объектно-ориентированного программирования.
Классы и объекты
Объект является экземпляром класса, так же, как автомобиль является экземпляром колесного средства передвижения. Класс smallobj определяется в начале программы SMALLOBJ. Позже, в функции main(), мы определяем два объекта s1 и s2, являющихся экземплярами класса smallobj.
Каждый из двух объектов имеет свое значение и способен выводить на экран это значение. Результат работы программы выглядит следующим образом:
|
|
Значение поля равно 1076 - вывод объекта s1
Значение поля равно 1776 - вывод объекта s2
Рассмотрим подробнее первую часть программы, где происходит определение класса smallobj. Затем мы обратимся к функции main(), в которой задействованы объекты класса smallobj.
Объявление или спецификация класса
Объявление класса (class declaration) представляет собой описание членов класса: данных и методов. Часто объявление класса называют спецификацией. Члены-данные объявляются согласно правилам объявления переменных и могут иметь любой тип, включая тип класса и указателя на тип класса. Функции-члены в спецификации представлены прототипами.
Спецификация класса, как правило, размещается в отдельном заголовочном файле с расширением.h и имеет следующий формат:
class имя_класса {
private:
// закрытые члены класса protected:
// защищенные члены класса
public:
// открытые члены класса
};
Объявление класса начинается с ключевого слова class, за которым следует имя класса, и заканчивается точкой с запятой. Внутри фигурных скобок может находиться любое количество секций со спецификаторами доступа, причем спецификаторы могут повторяться
Спецификаторы доступа к членам класса
Спецификаторы доступа определяют доступность данных и методов в программе. Существуют следующие спецификаторы доступа:
public — открытый режим доступа. Члены класса доступны за пределами класса любым функциям программы;
protected — защищенный режим доступа. Члены класса доступны для методов этого класса, производных классов и дружественных классов. Производные классы и классы-друзья рассматриваются в следующих главах книги;
private — закрытый режим доступа. Члены класса доступны только для методов этого класса и классов-друзей.
Методы, которые предоставляют сервисные услуги класса, всегда объявляются со спецификатором public. Методы, используемые классом для собственных нужд, имеют спецификатор доступа private. Эти методы обеспечивают реализацию открытых функций-членов и скрывают сложности их реализации.
Реализация класса
Определение объявленных в спецификации класса методов располагается в отдельном файле с расширением. срр, называемом файлом реализации класса.
Когда файлы спецификации и реализации класса находятся в разных файлах, заголовок функции-члена должен включать область видимости согласно формату:
Тип_функции-члена имя_класса:: имя_функции-члена (список параметров)
Оператор разрешения области видимости:: используется в заголовке с той целью, чтобы все объявленные внутри класса идентификаторы обрабатывались внутри их собственного пространства имен, а также во избежание неоднозначности использования имен. Запись тела метода ничем не отличается от записи в обычной функции. В файл реализации класса следует включить файл со спецификацией класса, а также необходимые при определении функций заголовки стандартных библиотек.
#pragma once
Пример
// Book.h - спецификация класса СВоок
#pragma once class
CBook {
private:
char m_author [ 50 ]; // автор
char *m_pTitle; // указатель на название
int m_year; // год издания
public:
// методы установки значений
void setAuthor (const char*);
void setTitle (const char*);
void setYear (const int);
// методы возврата значений
char* getAuthor (void);
char* getTitle (void);
int getYear (void);
};
// Book.срр - реализация класса СВоок
#include "Book.h"
#include <string> // установить автора
void CBook:: setAuthor (const char* author) {
strncpy_s (m_author, 50, author, 49);
if (strlen (author) > 49) m_author [ 49 ] = '\0';
}
// установить название
void CBook:: setTitle (const char* title) {
delete [ ] m_pTitle;
m_pTitle = new char [strlen (title)+ 1];
strcpy_s (m_pTitle, strlen (title) + 1, title);
}
// установить год издания
void CBook:: setYear (const int year)
{ m_year = year; }
// вернуть автора
char* CBook:: getAuthor (void)
{ return m_author; }
// вернуть название
|
|
char* CBook:: getTitle (void)
{ return m_pTitle; }
// вернуть год издания
int CBook:: getYear (void)
{ return m_year; }
Определение класса
Определение класса smallobj в приведенной выше программе выглядит следующим образом:
class smallobj // определение класса
{
private:
int somedata; // поле класса
public:
void setdata(int d) // метод класса, изменяющий значение поля
{ somedata = d; }
void showdata() // метод класса, отображающий значение поля
{cout << "Значение поля равно " << somedata << endl; }
};
Определение начинается с ключевого слова class, за которым следует имя класса; в данном случае этим именем является smallobj. Подобно структуре, тело класса заключено в фигурные скобки, после которых следует точка с запятой (;) (не забывайте ставить этот знак. Конструкции, связанные с типами данных, такие, как структуры и классы, требуют после своего тела наличия точки с запятой, в отличие от конструкций, связанных с передачей управления, например функций и циклов).
private и public
Тело класса содержит два не встречавшихся раньше ключевых слова: private и public. Сейчас мы раскроем их смысл.
Ключевой особенностью объектно-ориентированного программирования является возможность сокрытия данных. Этот термин понимается в том смысле, что данные заключены внутри класса и защищены от несанкционированного доступа функций, расположенных вне класса. Если необходимо защитить какие-либо данные, то их помещают внутрь класса с ключевым словом private. Такие данные доступны только внутри класса. Данные, описанные с ключевым словом public, напротив, доступны за пределами класса.
Данные класса
Класс smallobj содержит всего одно поле данных somedata, имеющее тип int. Данные, содержащиеся внутри класса, называют данными-членами или полями класса. Число полей класса, как и у структуры, теоретически может быть любым. Поскольку перед описанием поля somedata стоит ключевое слово private, это поле доступно только внутри класса.
Методы класса
Методы класса — это функции, входящие в состав класса. Класс smallobj содержит два метода: setdata() и showdata(). Тела обоих методов состоят из одного оператора, который записан на одной строке с фигурными скобками, ограничивающими тело функции. Разумеется, можно использовать и более традиционный способ оформления функций:
|
|
void setdata(int d) // метод класса, изменяющий значение поля
{ somedata = d; }
void showdata() // метод класса, отображающий значение поля
{cout << "Значение поля равно " << somedata << endl; }
};
В тех случаях, когда тела методов невелики по размеру, имеет смысл использовать более сжатую форму их записи.
Поскольку методы setdata() и showdata() описаны с ключевым словом public, они доступны за пределами класса smallobj. Мы покажем, каким образом можно получить доступ к этим функциям, чуть позже.
Сокрытие данных и доступность функций
Как правило, скрывая данные класса, его методы оставляют доступными. Это объясняется тем, что данные скрывают с целью избежать нежелательного внешнего воздействия на них, а функции, работающие с этими данными, должны обеспечивать взаимодействие между данными и внешней по отношению к классу частью программы. Тем не менее, не существует четкого правила, которое бы определяло, какие данные следует определять как private, а какие функции — как public.