Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 11. Області видимості в програмі Лекції для студентів 2 курсу.

Презентация:



Advertisements
Похожие презентации
Класи пам'яті даних. Клас пам'яті, час існування та видимість об'єкта Кожен обєкт програми (змінна, функція,...) має свій тип і клас памяті. Тип визначає.
Advertisements

Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 10. Статичний поліморфізм Лекції для студентів 2 курсу Консультації: середа год.,
Основи алгоритмізації та програмування Надання значень величинам. Вказівки присвоєння та введення.
Вказівники Вказівник (або покажчик) – особливий тип даних, значенням якого є адреса певного байта оперативної памяті. Значення покажчика - це беззнакове.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 2. Копіювання об'єктів Лекції для студентів 2.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 3. Права доступу Лекції для студентів 2 курсу.
Типи даних мови Visual Basic та їх опис. Опис величин Величина - це об'єкт, який має стале або змінне значення. Основні характеристики величин: ім'я,
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 1. Принцип інкапсуляції Лекції для студентів 2.
Розробив: Студент 221 грп Олару Дмитро. Залежно від відстані виділяють: Локальні мережі – об'єднання комп'ютерів, що розміщені на невеликих відстанях.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 8. Параметризовані класи Лекції для студентів.
Вказівники на функції В мові С імя функції є константним вказівником на перший байт виконавчого коду функції. Це адреса оперативної памяті, яка відповідає.
Основи алгоритмізації та програмування Підпрограми.
Урок 10 5 клас. Комп'ютернні мережі. Локальна мережа. Використаннямережевих папок
База даних (БД) це структурована сукупність взаємопов'язаних даних певної предметної області (реальних об'єктів, процесів, явищ тощо). це структурована.
Опрацювання структур у функціях Оскільки мова С інтерпретує структури як звичайні змінні, а не вказівники, можна передавати значення структури у функцію.
Дипломний проект Виконав: студент гр. П Ярошенко Я.І. Керівник дипломного проекту Сібрін Ю.І. Розробка програми Продаж друкованої продукції.
Урок 6 5 клас. Файли, папки та операції над ними.
Підпрограми (процедури і функції). Підпрограмою – називається найменована логічно закінчена група вказівок, яку можна викликати для виконання довільну.
Для здійснення інформа- ційних процесів компютеру треба вміти відрізняти одне повідомлення від іншого.
Програми, модулі 1. Структура програми на ТП 1. Структура програми на ТП 1. Структура програми на ТП 1. Структура програми на ТП 2. Вигляд програми на.
Транксрипт:

Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 11. Області видимості в програмі Лекції для студентів 2 курсу

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 2 (41) Основні питання Кому, що, звідки видно? Що де доступно? Хто кого затіняє?

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 3 (41) Види імен Імена об'єктів Імена типів (структур, класів) Імена функцій Кожне ім'я має унікальну інтерпретацію в межах своєї області видимості, яка може складатися з кількох файлів, кожен з яких може компілюватися окремо Для забезпечення можливості осібної компіляції до файлу з текстом програми (.cpp) додаються заголовні файли (.h), в яких пояснюються (оголошуються) імена, необхідні для компіляції цього файлу

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 4 (41) Визначення і оголошення Визначення приводить до створення об'єкту Визначення розміщують в.cpp файлах На підставі визначення будується об'єктний код для створення об'єкту Оголошення пояснює існуючий об'єкт Оголошення розміщують в.h файлах Оголошення служать для побудови об'єктного коду, що використовує об'єкт

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 5 (41) Файл програмного коду root.cpp //Визначення функції double root (double x, double eps) { double s=0.5*x; double t; do { t=s; s=(s+x/s)*0.5; } while ((fabs(s-t)/s)>eps); return s; };

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 6 (41) Заголовний файл root.h //Оголошення функції double root (double x, double eps);

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 7 (41) Використання функції root int main (int argc, char* argv[]) { const double two=2.0; const double prec = ; cout.precision(17); // Де взяти інформацію про типи параметрів і результату? cout << root (two, prec)<<endl; return 0; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 8 (41) Використання функції root #include "root.h int main (int argc, char* argv[]) { const double two=2.0; const double prec = ; cout.precision(17); // Приєднати файл root.h cout << root (two, prec)<<endl; return 0; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 9 (41) Омоніми Чи може ім'я root використовуватися в програмі за іншим призначенням? Так, в іншій області видимості

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 10 (41) Видимість Глобальна область видимості (вся програма) Простори імен Локальна область видимості –блок, –функція, –файл, –клас (з'явиться пізніше)

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 11 (41) Глобальна область видимості Дорога до пекла в програмуванні вимощена глобальними змінними Steve McConnell, Code Compete Глобальна область видимості об'єкти, функції і типи, визначені за межами блоків будь-якого типу

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 12 (41) Глобальні визначення //unit1.cpp int g_Var = 20;//Визначення глобальної змінної void f(void)//Визначення функції { cout<<"I am f () from unit1 and I see g_Var="; cout<<g_Var<<endl; return; } Функція void f(void) бачить змінну g_Var, оскільки вони визначені в одному файлі

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 13 (41) Доступ до глобальних імен і функцій Як відкомпілювати програму, що використовує глобальні об'єкти з іншого файлу? Як дати функції int main() можливість побачити змінну g_Var? //unit2.cpp int main() { cout<<g_Var<<endl; //Як використати змінну f();// g_Var з unit1.cpp? return 0; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 14 (41) Заголовний файл Для розповсюдження інформації про об'єкти, визначені у файлі unit1.cpp, створюємо заголовний файл //unit1.h //Оголошення глобальних об'єктів void f(void); extern int g_Var; Оголошення функції відрізняється від визначення відсутністю її тіла. Щоб відрізнити оголошення змінної від її визначення додають ключове слово extern

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 15 (41) Використання оголошень //unit2.cpp #include unit1.h" // #include unit1.cpp // чому не коректно приєднувати текст.cpp файлу? int main() { cout<<g_Var<<endl;//Використано оголошення f();//з unit1.h return 0; } extern int g_Var; void f(void);

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 16 (41) Глобальні типи Де розміщувати визначення структур? struct Point { double _x, _y; }; 1.Якщо безпосередньо в.cpp файлі, то як дати доступ до цього визначення з різних файлів? 2.Якщо в заголовному файлі.h, то як усунути повторні визначення при приєднанні одного заголовного файлу до різних.cpp файлів?

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 17 (41) Захист заголовного файлу Заголовні файли захищають від повторного включення в текст програми при одночасній компіляції багатьох файлів //File Point.h #ifndef _POINT_H_ #define _POINT_H_ struct Point { double _x, _y; }; #endif

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 18 (41) Визначення структур, оголошення функцій //WrappedVector.h #ifndef _WRAPPEDVECTOR_H_ #define _WRAPPEDVECTOR_H_ struct WrappedVector { double *_v; static size_t n; }; double operator* (const WrappedVector&, const WrappedVector&); #endif

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 19 (41) Визначення узагальнених функцій //TemplateVector.h template struct WrappedVector{ T *_v; static size_t n; }; template T operator* (const WrappedVector & u, const WrappedVector & v) { T s=0; for(size_t i=0; i ::n; ++i) s+=u[i]*v[i]; return s; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 20 (41) Визначення відкритих функцій #ifndef _POINT_H_ #define _POINT_H_ struct Point { double _x, _y; }; inline const Point operator+ (const Point& u, const Point& v) { Point result={u._x+v._x, u._y+v._y}; return result; } #endif

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 21 (41) Оголошення типів Чи всі програмні файли потребують визначення структури і відповідного #include? Ні, часом досить лише оголошення структури Часто #include в іншому заголовному файлі недоречний (доробка на майбутнє) //Some.h struct Point;//оголошення структури //досить для указника без ініціалізації Point * p; //досить для оголошення функції без виклику Point sum (Point a, Point b);

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 22 (41) Простір імен. Оголошення Простір імен дає можливість зібрати пов'язані між собою позначення в одному місці та відрізняти їх від інших імен з глобального контексту //File.h void f(void); namespace myNames { void f(void); void g(void); } Тут присутні дві різні функції void f(void)

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 23 (41) Визначення елементів простору імен //File.cpp void f(void) { cout<<"I am global"; return; } void myNames::f(void) { cout<<"I am f from myNames"; return; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 24 (41) Операція розв'язання області видимості //Source.cpp #include "File.h " int main() { f(); //взяти f з глобального контексту myNames::f();//взяти f з простору myNames myNames::g();//взяти g з простору myNames return 0; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 25 (41) Приєднати простір імен //Source.cpp #include "File.h " using namespace myNames; int main() { ::f(); //взяти f з глобального контексту myNames::f();//взяти f з простору myNames g();//взяти g з простору myNames return 0; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 26 (41) Стандартний простір імен std Стандартний простір імен містить визначення імен і типів Наприклад, cin, сout, endl istream, ostream Їх можна вживати через операцію розв'язання області дії std::сout, std:: endl std:: ostream, std:: istream Наприклад, std::cout<<"x="<<x<<std::endl; Можна приєднати простір імен using namespace std;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 27 (41) Тип, локалізований у структурі struct Point { // Тип указника координати точки typedef double Point::*Coord; double _x; double _y; }; inline double select (const Point& u, const Point::Coord coord); inline double modify (Point& u, Point::Coord coord, double a);

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 28 (41) Реалізація селектора і модифікатора inline double select (const Point& u, const Point::Coord coord) { return u.*coord; } inline double modify (Point& u, Point::Coord coord, double a) { return (u.*coord=a); }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 29 (41) Використання вбудованого типу Point u={1,2}, v={3,4}; Point::Coord cx = &Point::_x; Point::Coord cy = &Point::_y; std::cout << select(u, &Point::_x)<<': << select(u, &Point::_y)<<std::endl; modify(u, &Point::_x,10); modify(u, cy, 20); std::cout<< select(u,cx)<<': << select(u, cy)<<std::endl;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 30 (41) Локалізація функцій в структурі struct Point { typedef double Point::*Coord; // Статичні селектор і модифікатор static double select (const Point& u, const Point:: Coord coord); static double modify (Point& u, Point:: Coord, double a); double _x; double _y; };

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 31 (41) Реалізація селектора і модифікатора inline double Point::select (const Point& u, const Point::Coord coord) { return u.*coord; } inline double Point::modify (Point& u, Point::Coord coord, double a) { return (u.*coord=a); }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 32 (41) Ще раз: Використання вбудованого типу Point u={1,2}, v={3,4}; Point::Coord cx = &Point::_x; Point::Coord cy = &Point::_y; std::cout<<Point::select(u, &Point::_x)<<': <<Point::select(u, &Point::_y)<<std::endl; Point::modify(u, &Point::_x,10); Point::modify(u, cy, 20); std::cout<<Point::select(u,cx)<<': <<Point::select(u, cy)<<std::endl;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 33 (41) Використання вбудованих селектора і модифікатора Point u={1,2}, v={3,4}; Point::Coord cx = &Point::_x; Point::Coord cy = &Point::_y; std::cout<<Point::select(u, &Point::_x)<<': <<Point::select(u, &Point::_y)<<std::endl; Point::modify(u, &Point::_x,10); Point::modify(u, cy, 20); std::cout<<Point::select(u,cx)<<': <<Point::select(u, cy)<<std::endl;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 34 (41) Локальна область видимості Кожна функція і блок визначають свою власну локальну область видимості. Вона складається з області видимості, в якій знаходиться блок чи визначення функції, доповненої власним простором імен. Деякі імена з ширшого контексту при цьому можуть затінятися локальними іменами. Погодження. Локальні області видимості не можуть містити визначень функцій, але можуть містити визначення типів даних

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 35 (41) Розв'язання глобальної області видимості int x = 1; int main() { int x = 2; cout<<"x="<<x<<endl;//локальна х cout<<"::x="<<::x<<endl;//глобальна х return 0; } Локальна змінна затіняє однойменну змінну з ширшого контексту. Розв'язання (доступ до глобальної) можливе

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 36 (41) Глобальні об'єкти Рекомендується уникати глобальних об'єктів (чому?), але глобальні сталі абсолютно правомірні Визначення //some.cpp const float pi = ; Оголошення //some.h extern const float pi;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 37 (41) Вкладені блоки Область видимості блоку включає глобальний контекст, в якому цей блок знаходиться, доповнений локальними об'єктами з блоку Чим вужча область видимості кожного об'єкту, тим краще double x, y;…………………… if (x>y) { double z = x; x=y; e=z; } cout<<z;//ERROR: undeclared identifier

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 38 (41) Вкладені блоки int main() { int x = 1; { int x = 2; cout<<"x="<<x<<endl;//синя х } cout<<"x="<<x<<endl;//зелена х return 0; } Внутрішня змінна затіняє однойменну локальну змінну з ширшого контексту. Розв'язання неможливе

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 39 (41) Область видимості функції Область видимості функції включає глобальний контекст (краще, щоб його не було), в якому це визначення знаходиться, доповнений параметрами та локальними об'єктами з тіла функції const int n=10; double prod(double x[], double y[]) {//{n} + {x, y, sum} + {i} double sum = 0; for (int i=0; i<n; i++) sum += x[i]*y[i]; return sum; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 40 (41) Файл як область видимості Можна обмежити видимість об'єктів.cpp файлом, у якому вони визначені. Такі об'єкти називають статичними //some.cpp static unsigned currentID = 0; void increaseID() { ++currentID; return;} int getFreeID() { increaseID(); return currentID; }

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 41 (41) Персистентність Персистентність визначає тривалість життя об'єктів від моменту зв'язування до моменту видалення Зв'язування об'єкту з його значенням раннє (статичне) пізнє (динамічне)

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 42 (41) Статичне зв'язування При складанні програми константи препроцесора (уникаємо їх – чому?) #define PI ім'я функції з її тілом void f() { cout <<« I am f()"<<endl; return; } При компіляції іменовані константи const float pi = ; глобальні і статичні змінні static unsigned int currentID = 0;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 43 (41) Динамічне зв'язування Після входу в блок { double z=x; x=y; y=z;} При виклику функції u = root (v, e); // double x = v, double eps = e При виділенні пам'яті int * p = new int (1);

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 44 (41) Тривалість життя Локальні об'єкти живуть до кінця виконання блоку чи функції (в стеку) Створені програмою (за допомогою new) об'єкти живуть, доки їм дозволяє програма (видалення за допомогою delete) (в купі, in heap) Глобальні і статичні об'єкти живуть до кінця виконання програми Постійні об'єкти можуть зберігатися у файлах (базах даних) і жити вічно

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 45 (41) Призначення об'єктів Кожній змінній одне призначення //Багатоцільові змінні ознака кепського тону! temp = sqrt(b*b – 4*a*c) root[0] = (-b -temp)/(2*a); root[1] = (-b+temp)/(2*a); ……………………. temp = root[0]; root[0] = root[1]; rout[1] = temp;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 46 (41) Призначення об'єктів Кожній змінній одне призначення //Добре double discriminant = sqrt(b*b – 4*a*c) root[0] = (-b - discriminant)/(2*a); root[1] = (-b+ discriminant)/(2*a); ……………………. double replacer = root[0]; root[0] = root[1]; rout[1] = replacer;

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 47 (41) Вибір імен 1.Ім'я повинно виражати суть об'єкту 2.Чим ширша область видимості об'єкту, тим важливіша виразність його імені. Імена виду x, i, k, тощо, якщо вживаються, то вказують на те, що їх область видимості кілька рядків Приклади currentDate, linesPerPage done, found

© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 48 (41) Дисципліна іменування Корисно називати об'єкти так, щоб ім'я виражало його роль. Корисно розрізняти імена типів, наприклад, size_t імена структур і класів зазвичай з великої літери, наприклад, Point, Collection імена членів структур, наприклад, _x імена констант, наприклад, LOCAL_CONSTANT, kConst глобальні імена, наприклад, gThisGlobal Особливо важлива дисципліна іменування у великих проектах