МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
І Н С Т Р У К Ц І Я
до лабораторноі работи № 1
Особливості мови об’єктно-орiєнтованого програмування С++.
з курсу " Методи та засоби об’єктно-орієнтованого проектування "
для студентів
спеціальності 7.080402 - "Інформаційні технології пректування"
ЗАТВЕРДЖЕНО:
на засіданні кафедри САПР
Протокол № 14 від 3.04.1997 р.
Львів -2001
1. МЕТА РОБОТИ
Мета роботи - ознайомлення з особливостями мови об’єктно-орiєнтованого програмування С++.
2. ТЕОРЕТИЧНА ЧАСТИНА
2.1. Основнi вiдмiнностi С++ вiд С.
С++ - унiверсальна мова програмування, яка задумана так, щоб зробити програмування бiльш приємним для серйозного програмiста. С++ була розроблена так, щоб дати можливiсть однiй людинi без надмiрних зусиль написати програму в 2500 стрiчок.
За базову мову для С++ була вибрана мова С, тому що:
вона вiдносно низького рiвня.;
вiдповiдає бiльшостi задач системного програмування;
вже створено мiльони стрiчок бiблiотечних функцiй i сервiсних програм, написаних на С;
iснують сотнi тисяч програмiстiв, якi знають С.
До ключових слiв визначених в С у мову С++ дано такі ключовi слова:
overload
delete
friend
protected
catch
new
inline
public
try
this
operator
template
throw
class
private
virtual
Основна рiзниця мiж цими мовами полягає у методi побудови програм:
мова С - модульна мова i внаслiдок цього парадигма програмування звучить так “Визначте, якi модулi вам потрiбно; розчленiть програму так, щоб данi були захованi в модулях”;
мова С++ - об’єктно-орiєнтована мова i внаслiдок цього парадигма програмування звучить так “Визначте, якi класи вам потрiбно; пiдготуйте повний набiр операцiй для кожного класу”.
Об’єктно орiєнтоване програмування (ООП) включає в собi найкраще з структурного програмування i, використовуючи новi концепцiї дозволяє програмiсту набагато простiше розбити задачу на пiдзадачi, якi пiддаються керуванню. Цi концепцiї називаються: об’єкти, полiморфiзм, успадкування. Розглянемо їх детальніше.
Об’єкти
Об’єкт це логiчна одиниця, яка мiстить данi i код, що манiпулює цими даними. Всерединi об’єкту, код i/або данi можуть бути приватнi до об’єкту i недосяжнi будь-де за межами об’єкту. Таким чином об’єкт забезпечує певний рiвень захищеностi вiд iншої частини програми, що може випадково змiнити або некоректно використати цi данi. Об’єкт - це змiнна визначена самим користувачем. Коли ви визначаєте об’єкт ви неявно створюєте новий тип даних.
Полiморфiзм
ООП пiдримує полiморфiзм який означає що одне iм’я може бути використане для декiлькох зв’язаних, але дещо рiзних застосувань. Наприклад, ви можете мати програму, що визначає три рiзних типу стека. Один стек застосовується для типу integer, iнший для float а наступний для long. Завдяки полiморфiзму ви створюєте три функцiї для стеку push(), pop(), а компiлятор сам вибере потрiбну функцiю в залежностi вiд типу виклику.
Успадкування
За допомогою успадкування програмiст може виразити iєрархiчну класифiкацiю. Наприклад принтер “Epson LX 1050” є частиною матричних принтерiв, якi в свою чергу є частиною класу принтерiв, який також є частиною ширшого класу оргтехнiка. Без використання класифiкацiї, кожний об’єкт повинен явно визначити всi свої характеристики. З використанням успадкування кожному об’єкту потрiбно визначити тi особливостi, якi властивi саме цьому класу. Завдяки цим механiзмам акценти програмування в С++ змiщенi на проектування класiв, вiдносин мiж ними i лише потiм власне саме кодування. Треба пiдкреслити, що при правильному проектуванню проект легше пiддається контролю, що дозволяє писати великi i складнi проекти за коротший час з коротшим кодом, залучати велику кiлькiсть програмiстiв, вiдносно легко вносити змiни у програму. Це також зменшує кiлькiсть помилок, а отже i вартiсть програмного забезпечення, але водночас мова С++ не звiльняє програмiста вiд кодування i алгоритмiв.
Коротко про деякі технічні відмінності у мовах С++ і ANSI C:
Операція розширення області видимості (::)В межах класу заміняє глобальні змінні та глобальні функції.
Посилання (&)Розглянемо відому функцію swap(), яка служить для обміну значеннями між аргументами.
С-програма
С++-програма
void swap(int*a, int*b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void swap(int&a, int&b)
{
int t;
t=a;
a=b;
b=t;
}
Приклад наглядно ілюструє застосування операції посилання.
Бiблiотечнi функцiї malloc i free є стандартними С - функцiями, які використовують для видiлення i вивiльнення пам’ятi. Робота з пам’ятю в С++ набагато гнучкiша. Два оператора new i delete забезпечують роботу з пам’ятю. Вони автоматично викликаються при створеннi, знищеннi і копіюванні об’єкта без участi програмiста, при умові їх визначення.
Зникла необхiднiсть у препроцесорi #define, його з успiхом замiняють inline пiдстановки, та const.
Довжина змінних в С може бути до 32 знаків, в С++ на довжину не має обмежень.
Приведення до явного типу в С++ у визначених типів може відбуватися двояко. Наприклад:
(float) t;
float (t);
В ANSI С оголошення функцiї funct(void), визначає що виклик функцiї вiдбувається без аргументiв. Це допустимо для С++, але ключове слово void можна опустити без втрати змiсту виклику.
В С++ при оголошенннi функцiй написаних на мовi С, додається надпис extern “C”. Наприклад
extern “C” puts(const char* s);
main()
{
puts(“hello, world”);
}
В С++ на відміну від С існує виклик функцій по замовчуванню:
Наприклад:
int funct (double t = 5.7 );
виклик може відбувається таким чином:
int a = funct(); // виклик функції з аргументом t = 5.7
int a = funct(7.8); // виклик функції з аргументом t = 7.8
Змінні в С++ можуть оголошуватись будь-де в програмі
Наприклад:
for(int i = 0; i < 20; i++) {
...
}
Робота з потоками.
Мова С++ не забезпечує засоби для вводу/виводу. Цього йому і не потрібно: такі засоби легко і елегантно можна створити з допомогою самої мови.
Традиційно засоби вводу/виводу розроблялися для невеликого числа вбудованих типів даних. Але, в програмах на С++ як правило використовуються багато типів даних, визначених користувачем і тому потрібно також обробляти ввід і вивід значень цих типів. Очевидно, що засоби вводу/виводу повинні бути простими, зручними, надійними в керуванні, ефективними і гнучкими і до всього іншого повними.
С++ містить декілька визначених потоків, що автоматично відкриваються коли починається виконання С++ програми. Це стандартний ввід (cin), стандартний вивід (cout), вивід помилки (cerr).
Наприклад:
int a, b, c;
cin >> a;
cin >> b;
cin >> c;
cout << “a+b+c = ” << a+b+c << ‘\n’;
cout << “a*b*c = ” << a*b*c << ‘\n’;
Після вводу значень a = 2, b = 3, c = 4 на екрані з’явиться напис
a+b+c = 9
a*b*c = 24
Ввід і вивід для типу, визначеного користувачем.
Створимо клас two_d для роботи в декартовій площині. Загальна форма первантаженого оператора вводу така :
istream & operator >> (istream any_stream, class_name & object) {
// програма вводу користувача
return any_stream;
}
Перший параметр мусить бути посиланням до об’єкта типу istream. Другий параметр також посилання. Це необхідно, тому що змінні класу class_name може бути змінена. Функція повертає посилання на об’єкт типу istream.
Загальнийй вивід для типу користувача будується подібним чином:
ostream & operator << (ostream & any_stream, class_name object) {
// програма виводу користувача
return any_stream;
}
Нижче наведена програма, що демонструє ввід і вивід для типу two_d визначеного користувачем:
#include<iostream.h>
class two_d {
int x,y;
public:
two_d (int a, int b) {x=a; y=b;}
friend ostream & operator <<(ostream & stream, two_d obj);
friend istream & operator >>(istream & stream, two_d & obj);
};
ostream & operator << (ostream & stream, two_d obj)
{
stream << obj.x << ‘\n’;
stream << obj.y << ‘\n’;
return stream;
}
istream & operator >> (istream & stream, two_d & obj)
{
cout << “Enter x,y coordinates: ”;
stream >> obj.x >> obj.y;
return stream;
}
int main (void)
{
two_d a(1,2);
cout << a;
cin >> a;
cout << a;
return 0;
}
Форматування.
Деколи виникає необхідність регулювати вивід тексту. Функція width() вказує мінімальне число символів, які будуть використані наступною операцією виводу числового значення або символьної стрічки. Наприклад в результаті виконання
cout.width(5);
cout << ‘(’ << 4 << ‘)’;
буде надруковано число 4 в полі з 5 символів ( 4)
Символ-заповнювач можна задати функцією fill().
Наприклад в результаті виконання
cout.width(5);
cout.fill (‘#’);
cout << ‘(’ << “ab” << ‘)’;
отримаємо на виході (###ab).
Виклик функції width впливає тільки на операцію виводу, яка виконується безпосередньо за нею, так що в результаті отримується
cout << 1234.56789 << ‘\n’;
cout.setf (ios::scientific, ios::floatfield);
cout << 1234.56789 << ‘\n’;
cout.setf (ios::fixed, ios::floatfield);
cout <<1234.56789 << ‘\n’;
отримаємо 1234.57
1.2345678e+03
1234.567890
В результаті звертання до функції cout.precision(n) буде встановлене значення по замовчуванню для числа цифр, що друкуються, яке рівне n. Виклик функції precision впливає на всі наступні операції вводу/виводу до наступного виклику precision.
Відкривання і закривання файлів.
В С++ реалізуються три типи потоків для роботи з файлами.
ifstream in; // відкривання файла для читання
ofstream out; // відкривання файла для запису
fstream both; // відкривання файла для читання і запису
Якщо ви відкрили потік, єдиний шлях зв’язати потік з файлом реалізується функцією open(), яка є членом кожного з трьох класів, які реалізують ці потоки. Прототип цієї функції:
void open (char *filename, int mode, int access)
filename - імєя файлу
mode - спосіб відкриття файла
ios::app //додати
ios::ate //відкрити і шукати кінець файла
ios::in //відкрити для читання
ios::nocreate //приводить до неуспіху, якщо файл не існує
ios::noreplace //приводить до неуспіху, якщо файл існує
ios::out //відкрити для виводу
ios::trunc //відсікти файл до нульової довжини
access - визначає, з якими атрибутами відкритий файл
0 нормальний файл (по замовчуванню)
1 read-only
2 hidden
4 system
8 archive
Приклади відкривання файла:
ofstream out;
out.open (“test”, ios::out, 0);
fstream mystream;
mystream.open (“test”, ios::in | ios::out);
ifstream in;
in.open (“test”);
Якщо в силу будь-яких причин файл не може бути відкритий, значення потоку буде рівне 0.
Для закривання файла використовується функція-член close.
Приклад:
mystream close();
Для фіксування кінця файла використовується функція-член eof(), прототип якої
int eof();
Вона повертає ненульову величину, коли досягається кінець файла і навпаки.
Наступна програма записує ціле значення, значення з плаваючою точкою, символьну змінну і символьну стрічку у файл, а потім зчитує з цього файла.
#include<iostream.h>
#include<fstream.h>
int main (void){
char ch;
int i;
float f;
char str[80];
ofstream out (“test”);
if (! out){
cout << “Cannot open file”;
return 1;
}
out << 10 << “#” << 123.23 << ‘\n’;
out << “This is a short text file.”;
out.close();
ifstream in(“test”);
if (! in){
cout << “Cannot open file”;
return 1;
}
in >>i;
in >>f;
in >>ch;
in >>str;
cout << I << “ ” << f << “ “ << ch << ‘\n’;
cout << str;
in.close();
return 0;
}
Детальніше про потоки вводу/виводу можна знайти в довідкових посібниках.
3. КОНТРОЛЬНІ ЗАПИТАННЯ
Які рівні абстракцій в мові С++ ?
Які основні відмінності між С і С++ ?
Що таке поліморфізм ?
Що означає запис extern “C” ?
Як у С++ здійснюється приведення до типу ?
Як здійснюється виклик функцій по замовчуванню ?
Які потоки визначені при виконанні програми на С++ ?
Чим відрізняється посилання від вказівника ?
Для чого і як використовується операція розширення області видимості ?
4. ЛАБОРАТОРНЕ ЗАВДАННЯ
Одержати індивідуальне завдання (варіанти завдань дивись у додатку 1).
Скласти програму на С++, яка дозволяє визначити скільки біт використовується для представлення і діапазон значень типу (згідно варіанту).
Виконати програму і проаналізувати результати.
5.ЗМІСТ ЗВІТУ
Мета роботи.
Короткий опис основних відмінностей мов С і С++.
Індивідуальне завдання.
Текст програми на С++.
Результати виконання програми.
Аналіз результатів, висновки.
6. СПИСОК ЛІТЕРАТУРИ
Касаткин А.И., Вальвачев А.Н. Профессиональное програмирование на языке Си: От Turbo к Borland C++:Справ. пособие; Под общ. ред. А..И.Касаткина. - Мн.:Выш.шк., 1992
Бьярн Страуструп Язык програмирования С++ Т.1,:Киев “ДиаСофт”, 1993
Herbert Schildt Using Turbo C++, Osborn McGraw-Hill,1990
Greg Voss, Paul Chui Turbo C++ DiskTutor, Second Edition, Osborn McGraw-Hill,1991