Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Sizeof value 4 страница




Оголошення об'єднання починається з ключового слова union.

Як і під час оголошення структур, так і під час оголошення об'єднання не визначається жодна змінна. Змінну можна визначити, розмістивши її ім'я в кінці оголошення або скориставшись окремою настановою визначення. Щоб визначити змінну об'єднання іменем uVar типу demoUnion, достатньо записати так:

demoUnion uVar;

У змінній об'єднання uVar як змінна izm типу short int, так і символьна змінна ch розділяють одну і ту саму область пам'яті[40]. Як змінні izm та ch розділяють одну область пам'яті, показано на рис. 10.2:

Рис. 10.2. Змінні izm та ch разом використовують об'єднання uVar

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

Щоб отримати доступ до елемента об'єднання, використовують такий самий синтаксис, який застосовується і для структур: оператори "крапка" і "стрілка". При безпосередньому зверненні до об'єднання (або за допомогою посилання) використовують оператор "крапка". Якщо ж доступ до змінної об'єднання здійснюється через покажчик, використовують оператор "стрілка". Наприклад, щоб присвоїти букву "А" елемента ch об'єднання uVar, достатньо використати таку настанову:

uVar.ch = "А";

У наведеному нижче прикладі функції fun_c1() передається посилання на об'єднання uVar. У тілі цієї функції за допомогою покажчика змінної izm присвоюється значення 10:

fun_c1(&uVar); // Передаємо функції fun_c1() покажчик

// на об'єднання uVar.

//...

}

void fun_c1(demoUnion *un)

{

un->izm =10; // Присвоюємо число 10 члену

// об'єднання uVar за допомогою покажчика.

}

Оскільки об'єднання дають змогу складеній програмі інтерпретувати одні і ті ж самі дані по-різному, то вони часто використовують у випадках, коли потрібне незвичайне перетворення типів. Наприклад, наведений нижче код програми використовує об'єднання для перестановки двох байтів, які становлять коротке цілочисельне значення. Тут для відображення вмісту цілочисельних змінних використовується функція disp_binary(), розроблена в розд. 9[41].

Код програми 10.8. Демонстрація механізму використання об'єднання для перестановки двох байтів, які становлять коротке цілочисельне значення

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

void disp_binary(unsigned u);

union swapBytes { // Оголошення типу об'єднання

short int num;

char ch[2];

};

 

int main ()

{

swapBytes Sb_un;

char tmp;

 

Sb_un.num = 15; // Двійковий код: 0000 0000 0000 1111

cout <<"Початкові байти:";

disp_binary(Sb_un.ch[1]);

cout <<" ";

disp_binary(Sb_un.ch[0]);

cout <<"\n\n";

 

// Обмін байтів.

tmp = Sb_un.ch[0];

Sb_un.ch[0] = Sb_un.ch[1];

Sb_un.ch[1] = tmp;

cout <<"Байти після перестановки:";

disp_binary(Sb_un.ch[1]);

cout <<" ";

disp_binary(Sb_un.ch[0]);

cout <<"\n\n";

 

getch (); return 0;

}

 

// Відображення бітів, з яких складається байт.

void disp_binary(unsigned u)

{

register int t;

 

for (t=128; t>0; t=t/2)

if (u & t) cout << "1 ";

else cout << "0 ";

}

У процесі виконання програма відображає на екрані такі результати:

Початкові байти: 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

Байти після перестановки: 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0

У цій програмі цілочисельній змінній Sb_un.num присвоюється число 15. Перестановка двох байтів, що становлять це значення, виконується шляхом обміну двох символів, які утворюють масив ch. Як наслідок, старший і молодший байти цілочисельної змінної num міняються місцями. Ця операція можлива тільки тому, що як змінна num, так і масив ch розділяють одну і ту саму область пам'яті.

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

Код програми 10.9. Демонстрація відображення ASCII-коду програми символів у двійковій системі числення

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

 

// Бітові поля, які будуть розшифровані.

struct byteStruct { // Оголошення типу структури

unsigned a: 1;

unsigned b: 1;

unsigned c: 1;

unsigned d: 1;

unsigned e: 1;

unsigned f: 1;

unsigned g: 1;

unsigned h: 1;

};

 

union bitsUnion { // Оголошення типу об'єднання

char ch;

struct byteStruct bit;

} ascii;

void disp_bits(bitsUnion b);

 

int main ()

{

do {

cin >>ascii.ch;

cout <<": ";

disp_bits(ascii);

} while (ascii.ch!='q'); // Вихід при введенні букви 'q'.

 

getch (); return 0;

}

 

// Відображення конфігурації бітів для кожного символу.

void disp_bits(bitsUnion B_un)

{

if (B_un.bit.h) cout <<"1 ";

else cout <<"0 ";

if (B_un.bit.g) cout <<"1 ";

else cout <<"0 ";

if (B_un.bit.f) cout <<"1 ";

else cout <<"0 ";

if (B_un.bit.e) cout <<"1 ";

else cout <<"0 ";

if (B_un.bit.d) cout <<"1 ";

else cout <<"0 ";

if (B_un.bit.c) cout <<"1 ";

else cout <<"0 ";

if (B_un.bit.b) cout <<"1 ";

else cout <<"0 ";

if (B_un.bit.a) cout <<"1 ";

else cout <<"0 ";

cout <<"\n";

}

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

а: 0 1 1 0 0 0 0 1

b: 0 1 1 0 0 0 1 0

c: 0 1 1 0 0 0 1 1

d: 0 1 1 0 0 1 0 0

е: 0 1 1 0 0 1 0 1

f: 0 1 1 0 0 1 1 0

g: 0 1 1 0 0 1 1 1

h: 0 1 1 0 1 0 0 0

i: 0 1 1 0 1 0 0 1

j: 0 1 1 0 1 0 1 0

k: 0 1 1 0 1 0 1 1

l: 0 1 1 0 1 1 0 0

m: 0 1 1 0 1 1 0 1

n: 0 1 1 0 1 1 1 0

o: 0 1 1 0 1 1 1 1

p: 0 1 1 1 0 0 0 0

q: 0 1 1 1 0 0 0 1

Важливо! Оскільки об'єднання припускає, що декілька змінних розділяють одну і ту саму область пам'яті, то цей засіб дає змогу програмісту зберігати інформацію, яка (залежно від ситуації) може містити різні типи даних, і отримувати доступ до цієї інформації. По суті, об'єднання забезпечують низькорівневу підтримку принципів поліморфізму. Іншими словами, об'єднання забезпечує єдиний інтерфейс для декількох різних типів даних, втілюючи таким чином концепцію "один інтерфейс – багато методів" у своїй найпростішій формі.

10.5.2. Анонімні об'єднання

У мові програмування C++ передбачено спеціальний тип об'єднання, який називається анонімним. Анонімне об'єднання не має назви типу, і тому об'єкт такого об'єднання визначити неможливо. Але анонімне об'єднання повідомляє компіляторові про те, що його члени розділяють одну і ту саму область пам'яті. При цьому звернення до самих змінних об'єднання відбувається безпосередньо, без використання оператора "крапка".

Анонімні об'єднання дають змогу оголошувати різні змінні, які розділяють одну і ту саму область пам'яті.

Розглянемо такий приклад.

Код програми 10.10. Демонстрація механізму використання анонімного об'єднання

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

 

int main ()

{

union { // Оголошення анонімного об'єднання.

short int count;

char ch[2];

};

/* Ось як відбувається безпосереднє звернення до

членів анонімного об'єднання. */

ch[0] = 'x';

ch[1] = 'y';

cout <<"Об'єднання як символи: " << ch[0] << ch[1] << "\n";

cout <<"Об'єднання як цілі значення: " << count << "\n";

 

getch (); return 0;

}

Ця програма відображає наступний результат.

Об'єднання у вигляді символів: xy

Об'єднання у вигляді цілого значення: 31096

Число 31096 отримане внаслідок занесення символів x і y в молодший і старший байти змінної count відповідно. Як бачите, до обох змінних, що входять до складу об'єднання, як count, так і ch, можна отримати доступ так само, як до звичайних змінних, а не як до складових об'єднання. Незважаючи на те, що вони оголошені як частина анонімного об'єднання, їх імена знаходяться на тому ж самому рівні області видимості, що і інші локальні змінні, які оголошено на рівні об'єднання. Таким чином, член анонімного об'єднання не може мати імені, що збігається з іменем будь-якої іншої змінної, оголошеної в тій самій області видимості.

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

10.5.3. Використання оператора sizeof для гарантії переносності
коду програми

Як було показано вище, структури та об'єднання створюють об'єкти різних розмірів, які залежать від розмірів і кількості їх членів. Окрім цього, розміри таких вбудованих типів як int можуть змінюватися при переході від одного комп'ютера до іншого. Іноді компілятор заповнює структуру або об'єднання так, щоб вирівняти їх по границі парного слова або абзацу[42]. Тому, якщо у програмі потрібно визначити розмір (у байтах) структури або об'єднання, використовують оператор sizeof. He намагайтеся вручну виконувати додавання окремих членів. Через заповнення або інші апаратно-залежні чинники розмір структури або об'єднання може виявитися більшим від суми розмірів окремих їх членів.

Варто знати! Об'єднання завжди займатиме область пам'яті, достатню для зберігання його найбільшого члена.

Розглянемо такий короткий приклад:

union xUnion { // Оголошення типу об'єднання

char ch;

int izm;

double f;

} uVar; // Визначення змінної об'єднання

Тут у процесі виконання оператора sizeof для обчислення розміру об'єднання uVar отримаємо результат 8 (за умови, що double -значення займає 8 байтів). У процесі виконання програми немає значення, що реально зберігатиметься в змінній uVar; тут важливим є розмір найбільшої змінної, що входить до складу об'єднання, оскільки об'єднання повинно мати розмір найбільшого його елемента.

Переходимо до об'єктно-орієнтованого програмування

Цей розділ завершує опис не об'єктно-орієнтованих атрибутів мови програмування C++. Починаючи з наступного розділу, розглядатимемо засоби, які підтримують об'єктно-орієн­то­ва­не програмування (Object Oriented Programming – OOP), або ООП. Щоб зрозуміти об'єктно-орієнтовані засоби мови C++ і навчитися їх ефективно застосовувати, необхідне глибоке розуміння матеріалу цього і попередніх дев'яти розділів. Тому, можливо, читачу варто повторити пройдений матеріал. Особливу увагу під час повторення необхідно звернути на покажчики, структури, функції та перевантаження функцій.


Частина ІІ. Об'єктно-орієнтоване програмування мовою С++

 

У цій частині навчального посібника будуть розглядатися такі основні теми:

Розділ 11. Основи розроблення об'єктно-орієнтованих програм мовою C++........ 228

Розділ 12. Введення в класи..................................... 239

Розділ 13. Робота з класами..................................... 263

Розділ 14. Перевантаження операторів............ 285

Розділ 15. Успадкування в класах...................... 315

Розділ 16. Віртуальні функції та поліморфізм...................................................................................... 339

Розділ 17. Шаблони в класах................................... 353

Розділ 18. Оброблення виняткових ситуацій...................................................................................... 370

Розділ 19. С++-система введення-виведення потокової інформації................................... 388

Розділ 20. Динамічна ідентифікація типів і оператори приведення типу..................... 420

Розділ 21. Поняття про простори імен і інші ефективні програмні засоби.................... 436

Розділ 22. Введення в стандартну бібліотеку шаблонів............................................................... 461

Розділ 23. Особливості роботи препроцесора С++............................................................................... 500

Розділ 24. Формалізація процесу розроблення об'єктно-орієнтованого програмного забезпечення...................................................... 511

Додаток А. Основи створення консольних програм у середовищі Borland C++ Builder.................................................................... 544

Додаток Б. Основи створення консольних програм у середовищі Microsoft Visual C++............................................................................... 552

Додаток В. Дещо про С-систему введення-виведення............................................................. 558

Додаток Г. Особливості використання застарілого С++-компілятора................... 572

Додаток Д..NET-розширения для C++.................... 574

Література....................................................................... 577


Розділ 11. Основи розроблення об'єктно-орієнтованих програм мовою C++

Складність не в тому, щоби створити витвір мистецтва; складність в умінні зробити це.

Костянтин Бранкузі

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

● для чого потрібно знати ООП?

● які переваги ООП мовою С++ перед такими традиційними мовами програмування, як Pascal, Visual Basic чи C?

● що є основою ООП?

● який зміст термінів – об'єкти і класи?

● як пов'язані між собою мови С і C++?

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

11.1. Потреба об'єктно-орієнтованого програмування

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

11.1.1. Процедурні мови програмування

Мови програмування Pascal, Visual Basic, C чи інші схожі з ними мови належать до категорії процедурних мов. Кожен оператор такої мови дає вказівку комп'ютеру зробити певну дію чи їх послідовність, наприклад, прийняти дані від користувача, провести з ними певні арифметичні операції чи логічні дії та вивести отриманий результат на екран чи принтер. Програми, написані з використанням таких процедурних мов, є послідовностями певних настанов.

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

11.1.2. Поділ програми на функції

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

Якщо розвинути ідею поділу коду програми на функції, то можна об'єднати декілька функцій в програмний модуль, а його зробити окремим файлом. Однак навіть при такому підході зберігатиметься структурний принцип: код програми поділяється на декілька структурних компонент, кожна з яких є набором відповідних настанов.

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

11.1.3. Недоліки структурного програмування

У безперервному процесі зростання розміру програми, ускладнення її логіки чи виконуваних нею дій поступово стали виявлятися недоліки структурного програмування. Можливо, Ви інколи чули "страшні історії" від бувалих програмістів про те, як проходить робота над реалізацією програмного проекту, або навіть самим доводилося брати участь в розробленні такого проекту. Зміст цих історій зводиться до того, що часто технічне завдання виявлялося набагато складнішим, ніж це здавалося на перший погляд, тому терміни здачі проекту переносилися через різні причини його невиконання. Окрім того, залучені до роботи все нові та нові програмісти не тільки не пришвидшували темпи виконання робіт, але, як наслідок, різко збільшували фінансові витрати. Черговий термін завершення роботи знов переносився, і, у підсумку, проект зазнавав краху, якого варто було і чекати.

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

У чому ж недолік процедурно-орієнтованих мов програмування? Існує дві основні проблеми. Перша з них полягає в обмеженості доступу функцій до глобальних даних. Друга – в тому, що поділ даних і функцій, які є основою структурного програмування, погано відображає "картину реального світу" – фізичну сутність технічного завдання.

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

11.1.4. Неконтрольований доступ до даних

У структурній програмі, написаній, наприклад, процедурною мовою Pascal, існує два типи даних. Локальні дані знаходяться усередині будь-якої функції та призначені для використання винятково цією функцією. Наприклад, у програмі ведення складського обліку функція, яка здійснює виведення запису на екран, може використовувати локальні дані для зберігання інформації про запис, що виводиться. Локальні дані функції недоступні нікому, окрім самої функції, і не можуть бути змінені іншими функціями.

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

Великі програми зазвичай містять багато різних функцій і згрупованих глобальних даних. Проблема структурного підходу полягає в тому, що кількість можливих зв'язків між різними групами глобальних даних і використовуваними функціями може бути дуже великою, як це показано на рис. 11.2.

Велика кількість зв'язків між функціями і групами даних зазвичай породжує декілька додаткових проблем. По-перше, ускладнюється структура коду програми. По-друге, у код програми важко вносити нові зміни. Окрім того, будь-яка зміна структури глобальних даних може вимагати переписування всіх функцій, що використовують ці дані. Наприклад, якщо розробник програми ведення складського обліку вирішить зробити код програми не 5-значним, а 12-значним, то необхідно буде змінити відповідний тип даних з short на long. Це означає, що в усіх функціях, які оперують цими даними, мають бути внесені зміни, щоби дати змогу обробляти дані типу long. Можна навести аналогічний побутовий приклад, коли в супермаркеті з певних причин змінюється розташування відділів, внаслідок чого покупцям доводиться змінювати свій звичний шлях від одного відділу до іншого. Зрозуміло, обурення чи негативні емоції – чекати недовго.

Рис. 11.1. Концепція області видимості глобальних і локальних даних

Рис. 11.2. Структурний підхід до визначення зв'язків між глобальними
даними і функціями

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

11.1.5. Відображення картини реального світу

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

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

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

Таким чином, ні окремо взяті дані, ні відокремлені функції не здатні адекватно відображати фізичні об'єкти реального світу.

11.2. Поняття про об'єктно-орієнтований підхід

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

Рис. 11.3. Об'єктно-орієнтований підхід до визначення зв'язків між
даними і методами (функціями)

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

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

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

11.2.1. Виробнича аналогія

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




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


Дата добавления: 2014-11-29; Просмотров: 446; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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