double arrow

Сокрытие данных и доступность функций

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: