ua ru

IAPT

Головна » Програмне забезпечення » Чим хороший С++?

Чим хороший С++?

Чим хороший С++?

Вже довгий час не припиняються спори, що краще: Delphi або C/C++/Visual C++. Причому в більшості випадків порівнюються дві принципово різні речі. Адже до сьомої версії ім'я Delphi носило лише середовище розробки, а мова її компілятора була Object Pascal (у Delphi7 борландовці вирішили усунути таке упущення, і тепер і мова називається Дельфі). Те ж саме і з Visual C++: ця IDE накручена на Microsoft C/C++ Compiler (cl.exe). Тому коректним було б зіставлення Delphi і Visual Studio або об'єктного паскаля і C++. Чому саме сі-плюс-плюс, а не C? Та тому що C - процедурно-орієнтована мова середнього рівня, а Object Pascal - високорівневий, з підтримкою ООП і абстракцій, тобто це зовсім різні речі.

Така плутанина в поняттях примушує багатьох думати, що і C, і C++ - майже одне і те ж, адже це зовсім різні мови. Не занурюватимемося в нетрі Сі: тут все задоволено зрозуміло. Що таке C++? З цим питанням краще звернутися до його творця - Бьерну Страуструпу. Думаю, він би відповів приблизно так: "С++ - це мова, яка краще, ніж C підтримує абстракцію даних, об'єктно-орієнтоване (ООП) і узагальнене програмування." У тому, що все це означає, ми і розбиратимемося. Перш за все відмічу, що C++ розроблявся з нуля з метою додавання нових засобів до стандартного C.

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

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

Хоча нововведень теж немало: посилання, оператори введення-висновку, оператори для роботи з пам'яттю (new і delete), вбудований тип bool і т.п. Варто згадати і обробку виключень. Ось приклад функції, яка реалізує ввічливе, але наполегливе запрошення користувачеві вийти. Процедурне програмування - основа основ, його сталі застосовувати в перших програмах для перших ЕОМ. Але ніщо не стоїть на місці: складність програм росла, і з часом важливим питанням стала організація даних.

Так з'явилися модулі - набір процедур разом з даними, які вони обробляють. Став актуальний принцип заховання: "Організовуй код в модулях так, щоб приховати в них дані". На перший погляд не зовсім зрозуміло, що і навіщо потрібно приховувати. Відповідь проста: користувачеві функцій (хоча це такий же программер, як і їх розробник, назвемо його так) не цікаво, як вони працюють, для нього головне, щоб вони дійсно працювали. Тому розробник надає користувачеві якийсь інтерфейс (призначений для користувача) - все, що необхідне для виклику даного набору функцій (модуля). Реалізація ж цих функцій не видно користувачеві - вона прихована. За цим принципом побудована більшість бібліотек (наприклад, WINAPI, де код функцій знаходиться в системних dll'ках, а програмісти знають про них із заголовних файлів типу windows.h.

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

Такі типи називаються абстрактними або типами, визначуваними користувачем (призначеними для користувача). Освічені товариші, знайомі з ООП, думаю, вже зрозуміли, про що мова. Окрім класів, шаблонами можна оголошувати і функції, що теж дуже зручно. Це дозволяє писати універсальні функції сортування, пошуку і заміни елементів контейнерів-шаблонів. Шаблони широко використовуються в стандартній бібліотеці C++ - в STL (Standart Template Library). STL надає користувачам туєву хучу всяких контейнерів (від рядків до черг з двома кінцями), потоків введення-висновку, універсальних алгоритмів і багато що інше. Крім того, вона включає всю стандартну бібліотеку C. Висновок - must use. Користуватися їй настійно рекомендую ще і тому, що писали її не один рік, постійно покращуючи і модернізуючи.

Детально вивчайте рекомендації по використанню бібліотеки MFC і правила взаємодії з базами даних.