Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемФаина Гололобова
1 Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 11. Області видимості в програмі Лекції для студентів 2 курсу
2 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 2 (41) Основні питання Кому, що, звідки видно? Що де доступно? Хто кого затіняє?
3 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 3 (41) Види імен Імена об'єктів Імена типів (структур, класів) Імена функцій Кожне ім'я має унікальну інтерпретацію в межах своєї області видимості, яка може складатися з кількох файлів, кожен з яких може компілюватися окремо Для забезпечення можливості осібної компіляції до файлу з текстом програми (.cpp) додаються заголовні файли (.h), в яких пояснюються (оголошуються) імена, необхідні для компіляції цього файлу
4 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 4 (41) Визначення і оголошення Визначення приводить до створення об'єкту Визначення розміщують в.cpp файлах На підставі визначення будується об'єктний код для створення об'єкту Оголошення пояснює існуючий об'єкт Оголошення розміщують в.h файлах Оголошення служать для побудови об'єктного коду, що використовує об'єкт
5 © 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; };
6 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 6 (41) Заголовний файл root.h //Оголошення функції double root (double x, double eps);
7
© 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)<
8
© 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)<
9 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 9 (41) Омоніми Чи може ім'я root використовуватися в програмі за іншим призначенням? Так, в іншій області видимості
10 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 10 (41) Видимість Глобальна область видимості (вся програма) Простори імен Локальна область видимості –блок, –функція, –файл, –клас (з'явиться пізніше)
11 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 11 (41) Глобальна область видимості Дорога до пекла в програмуванні вимощена глобальними змінними Steve McConnell, Code Compete Глобальна область видимості об'єкти, функції і типи, визначені за межами блоків будь-якого типу
12
© 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<
13
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 13 (41) Доступ до глобальних імен і функцій Як відкомпілювати програму, що використовує глобальні об'єкти з іншого файлу? Як дати функції int main() можливість побачити змінну g_Var? //unit2.cpp int main() { cout<
14 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 14 (41) Заголовний файл Для розповсюдження інформації про об'єкти, визначені у файлі unit1.cpp, створюємо заголовний файл //unit1.h //Оголошення глобальних об'єктів void f(void); extern int g_Var; Оголошення функції відрізняється від визначення відсутністю її тіла. Щоб відрізнити оголошення змінної від її визначення додають ключове слово extern
15
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 15 (41) Використання оголошень //unit2.cpp #include unit1.h" // #include unit1.cpp // чому не коректно приєднувати текст.cpp файлу? int main() { cout<
16 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 16 (41) Глобальні типи Де розміщувати визначення структур? struct Point { double _x, _y; }; 1.Якщо безпосередньо в.cpp файлі, то як дати доступ до цього визначення з різних файлів? 2.Якщо в заголовному файлі.h, то як усунути повторні визначення при приєднанні одного заголовного файлу до різних.cpp файлів?
17 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 17 (41) Захист заголовного файлу Заголовні файли захищають від повторного включення в текст програми при одночасній компіляції багатьох файлів //File Point.h #ifndef _POINT_H_ #define _POINT_H_ struct Point { double _x, _y; }; #endif
18 © 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
19 © 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; }
20 © 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
21 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 21 (41) Оголошення типів Чи всі програмні файли потребують визначення структури і відповідного #include? Ні, часом досить лише оголошення структури Часто #include в іншому заголовному файлі недоречний (доробка на майбутнє) //Some.h struct Point;//оголошення структури //досить для указника без ініціалізації Point * p; //досить для оголошення функції без виклику Point sum (Point a, Point b);
22 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 22 (41) Простір імен. Оголошення Простір імен дає можливість зібрати пов'язані між собою позначення в одному місці та відрізняти їх від інших імен з глобального контексту //File.h void f(void); namespace myNames { void f(void); void g(void); } Тут присутні дві різні функції void f(void)
23 © 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; }
24 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 24 (41) Операція розв'язання області видимості //Source.cpp #include "File.h " int main() { f(); //взяти f з глобального контексту myNames::f();//взяти f з простору myNames myNames::g();//взяти g з простору myNames return 0; }
25 © 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; }
26
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 26 (41) Стандартний простір імен std Стандартний простір імен містить визначення імен і типів Наприклад, cin, сout, endl istream, ostream Їх можна вживати через операцію розв'язання області дії std::сout, std:: endl std:: ostream, std:: istream Наприклад, std::cout<<"x="<
27 © 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);
28 © 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); }
29
© 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)<
30 © 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; };
31 © 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); }
32
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 32 (41) Ще раз: Використання вбудованого типу Point u={1,2}, v={3,4}; Point::Coord cx = &Point::_x; Point::Coord cy = &Point::_y; std::cout<
33
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 33 (41) Використання вбудованих селектора і модифікатора Point u={1,2}, v={3,4}; Point::Coord cx = &Point::_x; Point::Coord cy = &Point::_y; std::cout<
34 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 34 (41) Локальна область видимості Кожна функція і блок визначають свою власну локальну область видимості. Вона складається з області видимості, в якій знаходиться блок чи визначення функції, доповненої власним простором імен. Деякі імена з ширшого контексту при цьому можуть затінятися локальними іменами. Погодження. Локальні області видимості не можуть містити визначень функцій, але можуть містити визначення типів даних
35
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 35 (41) Розв'язання глобальної області видимості int x = 1; int main() { int x = 2; cout<<"x="<
36 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 36 (41) Глобальні об'єкти Рекомендується уникати глобальних об'єктів (чому?), але глобальні сталі абсолютно правомірні Визначення //some.cpp const float pi = ; Оголошення //some.h extern const float pi;
37
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 37 (41) Вкладені блоки Область видимості блоку включає глобальний контекст, в якому цей блок знаходиться, доповнений локальними об'єктами з блоку Чим вужча область видимості кожного об'єкту, тим краще double x, y;…………………… if (x>y) { double z = x; x=y; e=z; } cout<
38
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 38 (41) Вкладені блоки int main() { int x = 1; { int x = 2; cout<<"x="<
39
© 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
40 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 40 (41) Файл як область видимості Можна обмежити видимість об'єктів.cpp файлом, у якому вони визначені. Такі об'єкти називають статичними //some.cpp static unsigned currentID = 0; void increaseID() { ++currentID; return;} int getFreeID() { increaseID(); return currentID; }
41 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 41 (41) Персистентність Персистентність визначає тривалість життя об'єктів від моменту зв'язування до моменту видалення Зв'язування об'єкту з його значенням раннє (статичне) пізнє (динамічне)
42
© 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 42 (41) Статичне зв'язування При складанні програми константи препроцесора (уникаємо їх – чому?) #define PI ім'я функції з її тілом void f() { cout <<« I am f()"<
43 © 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);
44 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 44 (41) Тривалість життя Локальні об'єкти живуть до кінця виконання блоку чи функції (в стеку) Створені програмою (за допомогою new) об'єкти живуть, доки їм дозволяє програма (видалення за допомогою delete) (в купі, in heap) Глобальні і статичні об'єкти живуть до кінця виконання програми Постійні об'єкти можуть зберігатися у файлах (базах даних) і жити вічно
45 © 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;
46 © 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;
47 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 47 (41) Вибір імен 1.Ім'я повинно виражати суть об'єкту 2.Чим ширша область видимості об'єкту, тим важливіша виразність його імені. Імена виду x, i, k, тощо, якщо вживаються, то вказують на те, що їх область видимості кілька рядків Приклади currentDate, linesPerPage done, found
48 © 2006 Бублик В.В. Процедурне програмування. 10. Області видимості у програмі 48 (41) Дисципліна іменування Корисно називати об'єкти так, щоб ім'я виражало його роль. Корисно розрізняти імена типів, наприклад, size_t імена структур і класів зазвичай з великої літери, наприклад, Point, Collection імена членів структур, наприклад, _x імена констант, наприклад, LOCAL_CONSTANT, kConst глобальні імена, наприклад, gThisGlobal Особливо важлива дисципліна іменування у великих проектах
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.