17121

Розробка програм з використанням класів

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота № 30 Тема: Розробка програм з використанням класів Ціль роботи: вивчити синтаксичні конструкції для оголошення визначення і використання класів. Розібратися з особливостями використання класів у мові С. Обладнання: ПКПО Borland C Теоретичні відо...

Украинкский

2013-06-29

112 KB

2 чел.

Лабораторна робота № 30

Тема: Розробка програм з використанням класів

Ціль роботи: вивчити синтаксичні конструкції для оголошення, визначення і використання класів. Розібратися з особливостями використання класів у мові С.

Обладнання: ПК,ПО Borland C++

Теоретичні відомості

Об'єкт - це абстрактна сутність, наділена характеристиками об'єктів реального світу. У С++ об'єкти грають дуже важливу роль. Усі, чим маніпулює програма, може розглядатися як об'єкт (екземпляр) визначеного класу. При виконанні програми об'єкти створюються і віддаляються. Вони взаємодіють з іншими об'єктами і можуть бути поміщені в масиви, списки, групи, колекції, і т.д.

Об'єкти в С++ - це програмні конструкції (перемінні), формовані так називаними класами. Визначення перемінної класу (об'єкта) також називається створенням екземпляра класу. За створення своїх класів повну відповідальність несе сам програміст. Але він може одержати доступ і до класів, розробленим іншими програмістами. Наприклад, до класів, що знаходяться в бібліотеці чи контейнерів бібліотеці потоків компілятора C.

Оголошення і визначення класу

Клас - це користувальницький тип даних, (аналогічно структурі), що містить (включає, инкапсулирует) не тільки оголошення даних, але і функції. Ці функції називаються функціями-членами класу і визначають, що може робити клас. Структури в С++ також можуть містити функції.

Для того, щоб використовувати клас, його потрібно спочатку оголосити точно так само, як це робиться зі структурами. І так само як для структур, повне оголошення класу може з'явитися в програмі тільки один раз. Розглянемо приклад оголошення простого класу:

class Counter {  // ім'я типу Counter

long  count;// дан-член класу, оголошено в розділі private за замовчуванням

public:        // розділений public, дані доступні з програми

void SetValue (long);  // функції-члени класу, оголошені в розділі public

long GetValue ();  

};

Ключове слово class вводить оголошення класу. Далі випливає ім'я класу (Counter). Тіло класу повинне полягати у фігурні дужки, після яких коштує крапка з коми. Класи можуть містити не тільки оголошення функцій, але і їхні повні визначення inline - функції. Функції усередині класів можуть бути настільки довгими і складними, наскільки це необхідно.

Перемінні, оголошені усередині класу, належать цьому класу. У деяких випадках перемінні можуть розділятися (використовуватися) різними екземплярами класу (із класом пам'яті static). Ідентифікатори (імена) перемінних і функцій усередині класу застраховані від конфліктів з ідентифікаторами інших класів. Клас - це замкнутий програмний комплект із власними ідентифікаторами.

Для ідентифікаторів класу застосовні ті ж правила, що і для інших чи типів імен перемінних. У С++ для ідентифікаторів гранична довжина не визначена, але в Borland C максимальна довжина дорівнює 32 символам. За замовчуванням усі 32 символу є значущими. Регістри букв (рядкова чи прописна) в ідентифікаторах розрізняються.

Тіло класу

Перемінна count оголошена усередині класу. Таким чином, count - це перемінн-член - (дан-член) класу. Будь-яка перемінна, визначена в класі, має область видимості класу. Область видимості перемінн-члена простирається від крапки її оголошення в класі до кінця оголошення класу.

У С++ дані і функції-члени, оголошені усередині класу, не містять специфікацію класу пам'яті (крім static) і лексично належать області дії даного класу.

Клас має стільки перемінних, скільки необхідно. Перемінні можуть бути будь-якого типу, включаючи інші класи, покажчики на об'єкти класів і навіть покажчики на об'єкти, що динамічно розподіляються.

Клас Counter містить оголошення функцій  SetValue () і GetValue (), що називаються функціями-членами класу. Ці функції поки не визначені, вони тільки оголошені. Як і інші функції в С++, функції-члени повинні бути оголошені до використання. Оголошення повинне бути повним, включаючи тип значення, що повертається, і типи аргументів.

Приклад

void Counter::Setvalue (long value)

{

count = value;  // зміна значення

// дан-члена count

}

long Counter::GetValue ()

{

return count; // повернути значення

// даного члена count

     }

При визначенні функції-члена після типу значення, що повертається, указується, членом якого класу є функція. Для цього потрібно написати ім'я класу і поставити за ним дві двокрапки – оператор дозволу області видимості.

Формат визначення функції -члена класу.

Визначення функцій для класу Counter звичайно здійснюється в інших модулях:

<Тип_ що повертається_значення>  <Ім'я_ класу> ::

<Ім'я_функції> (<Оголошення_ параметрів>)

{<Тіло _функції>}

Доступ до членів класу в загальному випадку здійснюється за допомогою нотації

<Ім'я_об'єкта> <Ім'я_члена_класу>,

крім функцій-членів, що мають прямий доступ до дан-членів.

Клас, оголошений усередині іншого класу, називається вкладеним класом. Його ім'я є локальним для класу, що охоплює. Вкладений клас має область дії, що лежить усередині області дії класу, що охоплює. Ця вкладеність є чисто лексичної. Вкладений клас не має ніяких додаткових привілеїв у доступі до  елементів класу, що охоплює, (і навпаки). Рівень вкладеності класів зазначеним образом є кожним.

Наприклад:

struct outer

{

typedef  int tint;  // вираження outer::tint - це синонім типу int tint x;

struct inner          // вираження outer::inner - це вкладена структура (клас)

{static int x;};       // статична перемінна (член) структури типу inner

tint y;

int f();                  // функція-член структури типу outer.

}

int outer::f()           // визначення функції-члена структури типу outer

{

tint y1=х;         // х бачимо і доступний тут, тому що функції-члени мають доступ до //дан-членів класу (структури)

return у1;

}

outer::inner::x=5;  // визначення статичного дан-члена класу

outer::  tint у=2;

Доступ до статичного дан-члена класу здійснюється по імені класу (outer:: inner::), а не по імені об'єкта класу.

Використання класу

Для того щоб використовувати клас, потрібно оголосити (створити) об'єкт цього класу. Об'єкти класу визначаються точно так само, як структурні чи скалярні перемінні. Оголошення класу повинне передувати використанню класу. Користувачу надається опис класу, але не обов'язково його внутрішня реалізація. Щоб оголосити перемінну (об'єкт) people типу Counter, використовується наступну запис:

Counter people;  // аналогічно оголошенню будь-який перемінний int a;

Counter* ptr       // аналогічно int* p;

Для виклику функції-члена об'єкта класу використовується той же запис, що і для звертання до елемента структури: за крапкою випливає ім'я елемента people.GetValue(). Аналогічний виклик і при використанні покажчиків
ptr-> GetValue() В іншому використання функцій-членів нічим не відрізняється від використання традиційних функцій С.

Інкапсуляція. Керування доступом до членів класу

Клас включає як дані, так і функції (код). Доступ до елементів класу керуємо. Це керування стосується не тільки даних, але і коду.

Щоб використовувати клас необхідно знати, які функції і які дані доступні. Набір використовуваних функцій і доступних даних називається користувальницьким інтерфейсом класу.

Головна турбота при створенні класу - сховати якнайбільше інформації. Це накладає обмеження на використання чи даних коду усередині класу. Існує три види користувачів класу:

сам клас  (функції-члени мають прямий доступ до членів класу);

звичайні користувачі  (доступ з функції main() і функцій);

похідні класи  (доступ із класів-спадкоємців до членів базових класів)

Кожен вид користувачів має різні привілеї доступу. Кожен рівень привілеїв доступу асоціюється з визначеним ключовим словом. Рівнів привілеїв доступу в Із усього три, вони визначаються ключовими словами:

private – закриті члени класу;

protected – захищені члени класу;

public – відкриті члени класу.

public - елемент може використовуватися будь-якою функцією й операторами програми;

private- елемент може використовуватися тільки функціями-членами і "друзями" класу, у якому вони оголошені;

protected - той же саме, що для private, але крім того, елемент може бути використаний функціями-членами і функціями-«друзями» класів, похідних від оголошеного класу.

Елементи класу за замовчуванням мають атрибут private, тому специфікатори  доступу public і protected повинні задаватися явно.

Елементи struct за замовчуванням мають атрибут public, але ви можете перевизначити доступ за допомогою специфікаторів доступу private чи protected.

Елементи union за замовчуванням мають атрибут publiс. Перевизначити його не можна. Задавати специфікатори доступу для елементів об'єднання неприпустимо.

Модифікатор доступу (за замовчуванням чи заданий) залишається дійсним для всіх наступних оголошень елементів, поки не зустрінеться інший модифікатор доступу. Наприклад:

class X {

int i;      // X::i за замовчуванням privаte

char ch;    // X::ch аналогічно Х::i

public:

int j;    // наступні два

// елемента - public

int k;     // відкриті дан-члени

protected:

int l;      // X::l - protected

};

struct Y {

int i;      // Y::i за замовчуванням public

private:

int j;      // Y::j - private

public:

int k;      // Y::k - public

};

union Z {

int i;  // public за замовчуванням,

// інших варіантів немає

double d; }; // public

Специфікатори доступу можуть випливати і повторюватися в будь-якій зручній послідовності.

Приклад:

class   AccessControlExample {

int  value_1; // приватні члена-класу за замовчуванням, доступні тільки

void f_1 (long);  //функціям – членам класу

private:

int   value_2; // теж приватні, доступні тільки

intf_2 (char *);   //функціям-членам класу

public:

char*  value_3; // загальнодоступні члени класу

long f_3 ();

protected:

int  value_4; // захищені члени, доступні тільки функціям – членам

void  f_4 (long);   //класи і класів-спадкоємців (похідних класів)

};

Приватні (private) члени класу мають найбільш обмежений доступ. Тільки сам чи клас класи, оголошені як дружні (friend) мають доступ до приватних членів. Похідні класи не мають доступу до приватних членів батьківського класу. Концепція приховання інформації реалізована в мові тільки частково, щоб запобігти ненавмисний доступ до внутрішніх перемінним чи функцій класу, оскільки навмисний доступ можна завжди одержати до будь-якої частини класу в обхід звичайних способів.

Для того, щоб використовувати загальнодоступні члени класу усередині функції, необхідно мати доступ до чи членів чи членам і до тому, і до іншого. Щоб зробити члени загальнодоступними, їхній потрібно оголосити в секції public.

Коли клас використовується як базовий для інших класів, можна зробити його члени доступними тільки для функцій похідних класів за допомогою слова protected .

Класи пам'яті для об'єктів

Клас, у змісті розподілу пам'яті, розглядається як вид структури. Як і структури, класи можуть бути оголошені з такими класами пам'яті, як автоматичний (auto), зовнішній (extern) чи статичний (static).

Перемінні (Ідентифікатори), оголошені усередині класу, видимі тільки в сполученні з об'єктами класу. При неоднозначному тлумаченні повинний використовуватися оператор дозволу області видимості (::).

Використання дан-членів класу

Інкапсуляція дозволяє сховати якісь данные і функції усередині класу. Даних може бути стільки, скільки потрібно і скільки дозволяє пам'ять. Однак їх може і не бути взагалі.

Спроба ініціювати дані усередині оголошення класу помилкова. Клас - це не об'єкт і пам'ять для нього не буде виділена доти, поки не буде створений екземпляр цього класу. Дані, оголошені в класі, варто розглядати як полючи структури, а не як перемінні. Як і для структури, потрібно оголосити об'єкт із типом (ім'ям) класу, а потім ініціювати дані члени.

Дан-члени створюються з тим же класом пам'яті, що й об'єкт класу. Якщо об'єкт з'являється автоматичним, то всі його дані будуть автоматичними. Статичні дан-члени є виключенням з цього правила: коли створюється об'єкт зі статичними членами (даними), пам'ять під них не виділяється, тому що це приведе до появи декількох копій статичних даних. Якщо в класі дане з'являється статичним (static), то всі екземпляри класу будуть розділяти одне і той же дан-член. Статичний член даних, як і глобальна перемінна, розміщається у фіксованій області пам'яті на стадії компонування. Для чи оголошення ініціалізації статичних даних використовується в точності та ж нотація, що і для глобальних перемінних (ехtern).

Якщо дан-член класу оголошений як статичний, то компоновщик виділяє під нього пам'ять тільки один раз, коли виробляється оголошення цього даного в класі. Тому ініціювати статичну перемінну можна в момент її оголошення. Статичні елементи завжди залишаються статичними.

Привілею доступу до статичних даних відрізняються від привілеїв  доступу до нестатичного. До статичного даного необхідно завжди звертатися через ім'я класу й оператор дозволу області видимості (::), незалежно від того, оголошений він як приватний, загальнодоступний чи захищений.

Оператор дозволу області видимості (::) – використовується для доступу до даних- членам:

через функцію-член класу;

через клас, оголошений дружнім для даного класу.

Для доступу до відкритих членів класу використовується оператор крапка (.) з чи об'єктами оператор (->) з покажчиками на об'єкти класу.

Для доступу до закритих і захищених членів класу використовуються функції-члени відкритої частини класу.

Приклад програми на С++

Скласти програму для оголошення і використання даних типу клас відповідно до індивідуального завдання, приведеному в таблиці 20.1.

Варіант

Поняття

Варіант

Поняття

6

Промислове виробництво

20

Плоттеры

#include<iostream.h>

#include<math.h>

class Prom{

public:

 void coutr();

 void cinr();

 static int iden;

private:

 char name[20],cena[20],number[20];

};

int Prom::iden=1;

void Prom::cinr()

{cout<<"Vvedite nazvaniye izdeliya: ";

cin>>name;

cout<<"Vvedite cenu izdeliya: ";

cin>>cena;

cout<<"Vvetite kollichestvo izdeliy: ";

cin>>number;

cout<<"-----\n";

}

void Prom::coutr()

{cout<<"Nazvaniye izdeliya: "<<name<<"\nCena izdeliya: "<<cena;

cout<<"\nKollichestvo izdeliy: "<<number<<"\n-----\n";

}

void main()

{int n,k,idenr;

cout<<"Vvedite chislo isdeliy: \n";

cin>>n;

Prom*arr=new Prom[n];

for(k=0;k<n;k++)

 arr[k].cinr();

idenr=Prom::iden;

cout<<"__________\n";

for(k=0;k<n;k++)

{cout<<"Nomer izgotovitelya: "<<idenr<<'\n';

 arr[k].coutr();}

}

Хід роботи

Вивчити теоретичні відомості.

Відповідно до індивідуального завдання розробити структуру класу, зробити визначення функцій-членів класу (class), розробити алгоритм використання об'єктів і покажчиків на об'єкти класу для доступу до даних і функцій- членам. Перевірити можливість доступу до членів класу в розділах private, public, protected. У розділах оголосити мінімум по одному дан-члені, включаючи статичні (static).

Набрати програму на комп'ютері.

Усунути помилки.

Одержати результат.

Оформити звіт.

Підготуватися до захисту лабораторної роботи, вивчивши контрольні питання по даній темі.

Індивідуальне завдання

Скласти програму для оголошення і використання даних типу клас відповідно до індивідуального завдання, приведеному в таблиці 20.1.

Таблиця 20.1 - індивідуальні завдання

Базовий клас

Похідний клас

Похідний клас

джерело світла

багаття

ліхтар

сховище

зерносховище

елеватор

вантажопідйомний засіб

кран

бруківки кран

тварина

кіт

кіт сіамський

рослина

дерево

дуб

транспортний засіб

літак

дельтоплан

транспортний засіб

автомобіль

легковий автомобіль

транспортний засіб

корабель

танкер

паливо

нафта

бензин

засіб інформації

книга

журнал

сховище інформації

твердий диск

дискета

засіб візуалізації

електронно-променева трубка

жидкокристалличний екран

джерело тепла

сонце

багаття

джерело струму

батарея

акумулятор

продукти

овочі

картопля

таймер

годинник

годинник наручні

морська фауна

риба

ковбаса

пишуче пристрій

ручка

кулькова ручка

пристрій, що ріже

ніж

ножиці

продукти

хліб

батон

інструмент

напилок

надфіль

метал

сталь

загартована сталь

меблі

крісло

стілець

будинок

цех

ковальський цех

будматеріали

цегла

фасонна цегла

одяг

куртка

піджак

пристрій передачі моменту, що крутить

редуктор

черв'ячний редуктор

взуття

черевики

кеди

головний убір

шапка

папаха

погода

дощ

ураган

спорт інвентар

лижі

санки

засіб зв'язку

телефон

радіотелефон

колесо

зубчасте колесо

косозубе колесо

водойма

море

водоймище

оптичний прилад

труба

бінокль

флора

ліс

кущ

посуд

каструля

тарілки

Вимоги до змісту звіту приведені в лабораторній   роботі   №1.

Контрольні запитання

1.Дайте визначення поняттям: об'єкт, клас, дан-члени класу, функції-члени класу.

2.У чому відмінність між класом і об'єктом класу?

3.Чи можна визначити функцію усередині класу?

4.Чи можна використовувати в різних класах однакові імена даних і функцій-членів?

5.Які класи пам'яті можна використовувати при оголошенні об'єктів?

6.Чи можна використовувати класи пам'яті при оголошенні членів класу, чому?

7.Що означає термін інкапсуляція?

8.Як виробляється керування доступом до елементів класу?

9.Що означають специфікатори доступу public, protected, private

10.Назвіть специфікатор доступу за замовчуванням до членів класу і структури.

11.Чи обмежується кількість і порядок проходження розділів у класі?

12.Назвіть особливості використання статичних (static) членів класу.

13.Для чого використовується оператор дозволу області видимості (::)?

14.Чи можуть структури містити функції як елементи?

15.Чи можуть структури і класи бути вкладеними?

16.Яка область дії членів класу?

17.Як одержати доступ до статичних членів класу з програми?

18.Чи можна оголосити тип у тілі класу при оголошенні класу?


 

А также другие работы, которые могут Вас заинтересовать

60125. Учитель, ринок, технологія (Обираємо технологію) 207.94 KB
  Мета: обговорити підходи до вибору технології навчання з позицій потреб сучасного ринку освітніх послуг в Україні, визначити дієвість та конкурентоспроможність обраних технологій в інтерактивному спілкуванні студентів.
60126. ГЕРОИ НЕ УМИРАЮТ 85 KB
  2-й ведущий. Эта песня-воззвание неслась над страной в суровую военную годину. И тысячи людей брали в руки оружие, чтобы отстоять свободу и независимость любимой Родины.
60127. Українське кіномистецтво 951 KB
  Народилася Наталія Михайлівна Ужвій 22 серпня 1898 року в містечку Любомлі на Волині в селянській сім’ї. До 1912 року сім’я Ужвій жила в робітничому селищі Брудно поблизу Варшави.
60129. Класна година: Не рубай ялинку, не губи тваринку, а краще природу бережи 44 KB
  Вони ростуть у суворому кліматі там завжди дуже холодно ростуть на збіднених ґрунтах де мало вологи і поживних речовин. Слайд 3 Група 1 Ялинка як і всі вічнозелені дерева дуже красива. Людям у яких є хвороби серця чи дихальних шляхів це повітря дуже корисне...
60130. Хлеб - всему голова 73 KB
  Демонстрация видеоролика Хлеб - всему голова Вступительное слово преподавателя Гетман А. Хлеб во все времена и у всех народов наибольшей святостью считается хлеб. Когда не было хлеба приходила беда.
60131. Виховний захід: «Я - за безпечний Інтернет» 69.5 KB
  Мета: знайомство учасників для створення комфортної атмосфери для роботи Метод: індивідуальна робота Теоретична інформація: На ватмані малюється квітка без пелюстків. Вправа 2: Очікування гра Гаряча картопля...
60132. Музыкально - литературное кафе «Огонёк» 113.5 KB
  Воспитательная: формировать интерес и уважение к отечественной культуре; создать атмосферу единения характерную для концертов бардовской песни 60–-70х годов обогатить духовный мир учащихся.
60133. Вікторина «Найрозумніший»/ Quiz Der Klugste 37.5 KB
  lso wir hben hier 2 Mnnschfte die schon so ungeduldig uf den nfng wrten. Команди представляють себе: назва та девіз Ведучий: Gut gemcht Und jetzt kommt die ufwrmung Dfr ht mn feine Zungenbrecher usgewhlt. Mn muss die zuerst zusmmensetzen dnch liest jemnd uns vor und bekommt dfr 2 Punkte eine fr die Richtigkeit und eine fr ds Lesen selbst. Wie heit die Huptstdt der Bundesrepublik Deutschlnd Bonn; bFrnkfurt; cBerlin.