Страуструп Бьярн. Мова програмування С++

09.09.2015

Друге доповнене видання

Мови програмування / С++

Бьерн Страуструп

Мова програмування С++

Книга Б. Страуструпа «Мова програмування С++» дає опис мови,

його ключових понять і основних прийомів програмування на ньому. Це

Книга ділиться на три частини. Перші десять глав є підручником,

службовцям введенням у мову, включаючи власне підмножина С. В трьох

подальших розділах обговорюються питання проектування та створення

програмного забезпечення з допомогою С++. Книга завершується повним

довідковим посібником з мови.

* закінчений підручник і посібник з мови.

* повне висвітлення засобів мови, націлених на абстрактні типи даних

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

Ця книга буде гарним помічником досвідченому програмісту, який вирішив

С++ для нетривіальних завдань. Її можна вважати ключовою в

будь-якому зібранні книг по С++.

Про автора книги:

Бьерн Страуструп є розробником мови С++ і творцем першого

«А дорога йде все далі і далі»

(Більбо Бэгинз)

Як було обіцяно в першому виданні книги, запити користувачів

визначили розвиток С++. Його направляв досвід широкого кола користувачів,

працюючих в різних областях програмування. За шість років, що відділяють

нас від першого видання опису З++, кількість користувачів зросла в сотні

раз. За ці роки були засвоєні багато уроки, були запропоновані і підтвердили

практикою своє право на існування різні прийоми програмування. Про

деякі з них і піде мова нижче.

Зроблені за ці шість років розширення мови насамперед були

направлені на підвищення виразності С++ мови як абстракції даних і

об’єктно-орієнтованого програмування взагалі і як засоби для

створення високоякісних бібліотек з користувацькими типами даних

зокрема. Бібліотекою високої якості ми вважаємо бібліотеку,

дозволяє користувачеві визначати з допомогою класів поняття, робота з

якими поєднує зручність, ефективність і надійність. Під надійністю

розуміється те, що клас надає захищений за типами інтерфейс між

користувачами бібліотеки та її розробниками. Ефективність припускає,

що використання класів не тягне за собою великих накладних витрат

пам’яті або часу порівняно з «ручними» програмами на С.

Ця книга є повним описом мови С++. Розділи з 1 по 10

являють собою підручник, який знайомить з мовою. У главах з 11 по 13

обговорюються питання проектування і розвитку програмного забезпечення.

Завершується книга довідковим посібником з мови С++. Природно, що

всі розширення мови і способи їх використання, які з’явилися після

виходу в світ першого видання, є частиною викладу. До них відносяться

уточнені правила для вирішення перевантаження імені, засоби управління

пам’яттю і засоби контролю доступу, надійна за типами процедура

зв’язування, статичні і постійні функції-члени, абстрактні класи,

множинне спадкування, шаблони типів і обробка особливих ситуацій.

З++ є мовою програмування загального призначення.

Природна для нього область застосування — системне програмування,

розуміється в широкому сенсі цього слова. Крім того, З++ успішно

використовується в багатьох областях програми, що виходять далеко за

зазначені межі. Реалізації С++ тепер є на всіх машинах, починаючи

з найскромніших мікрокомп’ютерів — до найбільших супер-ЕОМ, і

практично для всіх операційних систем. Тому книга дає лише опис

власне мови, не пояснюючи особливості конкретних реалізацій, середовища

програмування або бібліотек.

Читач знайде в книжці багато прикладів з класами, які, незважаючи

на безперечну користь, можна вважати іграшковими. Такий стиль викладу

дозволяє краще виділити основні поняття і корисні прийоми, тоді як в

справжніх, закінчених програмах вони були б приховані масою деталей. Для

більшості запропонованих тут класів, як то зв’язані списки, масиви,

рядка символів, матриці, графічні класи, асоціативні масиви і

т. д. — наводяться версії «зі 100% гарантією» надійності і правильності,

отримані на основі класів з самих різних комерційних і некомерційних

програм. Багато з «промислових» класів та бібліотек вийшли

прямі або непрямі нащадки іграшкових класів, що приводяться тут як

приклади.

У цьому виданні книги порівняно з першим більше уваги приділено

завдання навчання. Разом з тим, рівень викладу в рівній мірі враховує і

досвідчених програмістів, ні в чому не применшуючи їх знань і професіоналізму.

Обговорення питань проектування супроводжується більш широкої подачею

матеріалу, що виходить за рамки описів конструкцій мови та способів їх

використання. У цьому виданні наводиться більше технічних деталей і

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

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

напрямку. Передбачалося створити книгу з досить високим рівнем

викладу, яка б служила програмістам не тільки книгою для читання.

Отже, перед вами книга з описом мови С++, його основних принципів і

методів програмування. Сподіваємось, що вона принесе вам радість.

Вираз вдячності

Крім осіб, перелічених у відповідному розділі передмови до

першого видання книги, мені хотілося б висловити свою подяку Елу

Луна, Стіву Бароффу, Джиму Коплину, Тому Хансену, Петеру Джаглу, Брайану

Кернигану, Ендрю Кенигу, Біллу Леггету, Лоррейн Мингаччи, Уоррену

Монтгомері, Майку Моубри, Робу Мюррею, Джонатану Шапіро, Майку Вилоту і

«Мова утворює середовище мислення і формує

уявлення про те, про що ми думаємо».

(Б. Л. Уорф)

З++ — мова загального призначення і задуманий для того, щоб справжні

програмісти отримали задоволення від самого процесу програмування.

За винятком другорядних деталей він містить мову як підмножину.

Мова розширюється З введенням гнучких і ефективних засобів, призначених

для побудови нових типів. Програміст структурує своє завдання,

визначивши нові типи, які точно відповідають поняттям предметної

області завдання. Такий метод побудови програми зазвичай називають

абстракцією даних. Інформація про типи міститься у деяких об’єктах

типів, визначених користувачем. З такими об’єктами можна працювати

надійно і просто навіть в тих випадках, коли їх тип не можна встановити на

стадії трансляції. Програмування з застосуванням таких об’єктів зазвичай

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

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

Ключовим поняттям С++ є клас. Клас — це визначається

користувачем тип. Класи забезпечують упрятывание даних, їх

ініціалізацію, неявне перетворення користувацьких типів, динамічне

завдання типу, контрольоване користувачем керування пам’яттю і засоби

для перевантаження операцій. В мові С++ концепції контролю типів і модульного

побудови програм реалізовані більш повно, ніж у С. Крім того, З++

містить удосконалення, прямо з класами не пов’язані: символічні

константи, функції-підстановки, стандартні значення параметрів функцій,

перевантаження імен функцій, операції керування вільною пам’яттю і посилальний

тип. В С++ збережені всі можливості для ефективної роботи з основними

об’єктами, що відображають апаратну «реальність» (розряди, байти, слова,

адреси тощо). Це дозволяє досить ефективно реалізовувати

користувальницькі типи.

Дана книга в першу чергу розрахована на професійних

програмістів, що бажають вивчити нову мову і використовувати його для

нетривіальних завдань. У книзі дається повний опис С++, міститься багато

завершених прикладів і ще більше фрагментів програм.

Вираз вдячності

Мова С++ ніколи б не став реальністю без, якби постійно не

використовувалися пропозиції та поради та не враховувалася конструктивна

критика з боку багатьох друзів і колег. Особливо слід згадати Тома

Карджила, Джима Коплі, Стью Фельдмана, Сенді Фрезера, Стіва Джонсона,

Свій внесок у розвиток С++ і створення транслятора внесли сотні людей,

які надсилали мені пропозиції по вдосконаленню мови, опису

ПОПЕРЕДНІ ЗАУВАЖЕННЯ
Структура книги

Книга складається з трьох частин. Розділи з 1 по 10 є підручником з

мови. У главах з 11 по 13 обговорюються питання проектування і розвитку

програмного забезпечення з урахуванням можливостей З++. В кінці книги

наведене повне довідкове керівництво по мові. Вичерпний опис

конструкцій З++ міститься тільки там. Навчальна частина книги містить

Книга в основному присвячена питанню, як за допомогою мови C++

структурувати програму, а не питання, як записати на ньому алгоритм.

Отже, там, де можна було вибирати, перевага віддавалася не

професійним, але складним для розуміння, а тривіальним алгоритмами. Так

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

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

написати ту ж програму, але з більш ефективним алгоритмом, пропонується

у вигляді вправи.

Глава 1 містить стислий огляд основних концепцій і конструкцій З++.

Вона дозволяє познайомитися з мовою в загальних рисах. Докладні пояснення

конструкцій мови та способів їх застосування містяться в наступних

главах. Обговорюються в першу чергу засоби, що забезпечують абстракцію

даних і об’єктно-орієнтоване програмування. Основні засоби

процедурного програмування згадуються коротко.

У главах 2, 3 і 4 описуються засоби З++, які не використовуються

для визначення нових типів: основні типи, вирази і структури

управління. Іншими словами, ці глави містять опис тієї частини мови,

яка по суті являє С. Виклад у зазначених главах йде в

поглибленому вигляді.

Глави 5 — 8 присвячені засобам побудови нових типів, які не

мають аналогів в С. В розділі 5 вводиться основне поняття — клас. В ній

показано, як можна визначати користувальницькі типи (класи),

ініціалізувати їх, звертатися до них, і, нарешті, як знищувати їх.

Глава 6 присвячена поняттю похідних класів, яке дозволяє будувати

з простих класів більш складні. Воно дає також можливість ефективної і

безпечної (в сенсі типу) роботи в тих ситуаціях, коли типи об’єктів на

стадії трансляції невідомі. У главі 7 пояснюється, як можна визначити

унарні і бінарні операції для користувацьких типів, як задавати

перетворення таких типів, і яким чином можна створювати, копіювати і

видаляти об’єкти, що представляють користувальницькі типи. Глава 8 присвячена

шаблонів типу, тобто такого засобу З++, яка дозволяє визначити

сімейство типів і функцій.

У розділі 9 обговорюється обробка особливих ситуацій, що розглядаються

можливі реакції на помилки і методи побудови стійких до помилок

систем. У главі 10 визначаються класи ostream і istream, що надаються

стандартною бібліотекою для потокового введення-виведення.

Глави 11 — 13 присвячені питанням, пов’язаним із застосуванням С++ для

проектування і реалізації великих програмних систем. У главі 11

основному розглядаються питання проектування та управління програмними

проектами. У главі 12 обговорюється взаємозв’язок між мовою С++ і

проблемами проектування. У главі 13 показані способи створення бібліотек.

Завершується книга довідковим посібником з С++.

Посилання на різні частини книги даються у вигляді $$2.3.4, що означає

розділ 3.4 глави 2. Для позначення довідкового керівництва застосовується

буква R, наприклад, $$R. 8.5.5.

Зауваження по реалізації

Існує кілька поширюваних незалежних реалізацій С++.

З’явилася велика кількість сервісних програм, бібліотек та інтегрованих

систем програмування. Є маса книг, посібників, журналів, статей,

повідомлень по електронній пошті, технічних бюлетенів, звітів про

конференціях та курсів, з яких можна одержати всі необхідні відомості

про останні зміни в З++, його використання, сервісних програмах,

бібліотеках, нових трансляторах і т. д. Якщо ви серйозно розраховуєте на

З++, варто отримати доступ хоча б до двох джерел інформації, оскільки

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

Більшість програмних фрагментів, наведених у книзі, взяті

Вправи

Вправи даються в кінці кожної глави. Найчастіше вони пропонують

написати програму. Рішенням може вважатися програма, яка

транслюється і правильно працює хоча б на декількох тестах.

Вправи можуть значно різнитися за складністю, тому дається

приблизна оцінка ступеня їх складності. Зростання складності

експоненціальний, так що, якщо на вправу (*1) у вас піде п’ять хвилин,

(*2) може тривати годину (*3) — цілий день. Однак час написання і

відлагодження програми більше залежить від досвіду читача, ніж від самого

вправи. На вправу (*1) може знадобитися цілий день, якщо перед

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

системою. З іншого боку, той, у кого під рукою виявиться потрібний набір

програм, що може зробити вправу (*5) за одну годину.

Будь-яку книгу по програмуванню на мові С можна використовувати як

джерело додаткових вправ при вивченні розділів 2 — 4. У книзі Агв

([1]) наведено багато спільних структур даних і алгоритмів в термінах

абстрактних типів даних. Цю книгу також можна використовувати як джерело

вправ при вивченні глав 5 — 8. Однак, використаному в ній мові не

дістає функцій-членів і похідних класів. Тому обумовлені

користувачем типи на З++ можна написати більш елегантно.

Зауваження щодо проекту мови

При розробці мови С++ одним з найважливіших критеріїв вибору була

простота. Коли виникало питання, що спростити: керівництво по мові і

іншу документацію або транслятор, — то вибір робили на користь першого.

Величезне значення надавалося сумісності з мовою С, що завадило

видалити його синтаксис.

В С++ немає типів даних і елементарних операцій високого рівня.

Наприклад, не існує типу матриця з операцією поводження або типу рядок

з операцією конкатенації. Якщо користувачеві знадобляться такі типи, він

може визначити їх в самій мові. Програмування на З++ по суті

зводиться до визначення універсальних або залежних від області програми

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

типу тільки способом визначення, але не способом застосування.

З мови виключалися можливості, які можуть призвести до накладних

витрат пам’яті і часу виконання, навіть якщо вони безпосередньо не

використовуються в програмі. Наприклад, було відкинуто пропозицію зберігати в

кожному об’єкті деяку службову інформацію. Якщо користувач описав

структуру, що містить дві величини, що займають по 16 розрядів, то

гарантується, що вона поміститься в 32-х розрядний регістр.

Мова С++ проектувався для використання в досить традиційною

середовищі, а саме: в системі програмування З операційної системи UNIX.

Але є цілком обґрунтовані аргументи на користь використання С++ в більш

багатою програмної середовищі. Такі можливості, як динамічне завантаження,

розвинуті системи трансляції і бази даних для зберігання визначень типів,

можна успішно використовувати без шкоди для мови.

Типи С++ і механізми запроторення даних розраховані на певний

синтаксичний аналіз, проведений транслятором для виявлення випадкової

псування даних. Вони не забезпечують секретності даних і захисту від

навмисного порушення правил доступу до них. Однак, ці кошти можна

вільно використовувати, не боячись накладних витрат пам’яті і часу

виконання програми. Враховано, що конструкція мови активно використовується

тоді, коли вона не тільки витончено записується на ньому, але і цілком

засобам звичайними програмами.

Історична довідка

Безумовно С++ багатьом зобов’язаний мови З [8], який зберігається як його

підмножина. Збережені і всі властиві кошти З низького рівня,

призначені для вирішення найбільш нагальних завдань системного

програмування. З, в свою чергу, багатьом зобов’язаний своєму попереднику

мови BCPL [13]. Коментар мови BCPL був відновлений в С++. Якщо

читач знайомий з мовою BCPL, то може помітити, що в С++, як і раніше,

ні блоку VALOF. Ще одним джерелом натхнення була мова SIMULA-67

[2,3]; саме з нього була запозичена концепція класів (разом c

похідними класами і віртуальними функціями). Оператор inspect з

SIMULA-67 навмисно не був включений в С++. Причина — бажання

сприяти модульності за рахунок використання віртуальних функцій.

Можливість в С++ перевантаження операцій і свобода розміщення описів всюди,

де може зустрічатися оператор, нагадують мову Алгол-68 [24].

З моменту виходу в світ першого видання цієї книги мову З++ піддався

суттєвих змін і уточнень. В основному це стосується дозволу

неоднозначності при перевантаженні, зв’язування і управлінні пам’яттю. Разом з

тим, були внесені незначні зміни з метою збільшити сумісність

з мовою С. Були також введені деякі узагальнення і суттєві

розширення, як то: множинне спадкування, функції-члени

специфікаціями static const і, захищені члени (protected), шаблони типу

і обробка особливих ситуацій. Всі ці розширення і доопрацювання були націлені

на те, щоб З++ стала мовою, на якому можна створювати і використовувати

бібліотеки. Всі зміни описуються в [10,18,20,21 і 23].

Шаблони типів з’явилися частково через бажання формалізувати

макросредства, а частково були інспіровані описом генеричних

об’єктів в мові Ада (з урахуванням їх переваг та недоліків) і

параметризированными модулями мови CLU. Механізм обробки особливих

ситуацій з’явився почасти під впливом мов Пекла і CLU [11], а почасти

під впливом ML [26]. Інші розширення, введені за період між 1985 і

1991 р. р. (такі як множинне спадкування, статичні функції-члени

і чисті віртуальні функції), швидше з’явилися в результаті узагальнення

досвіду програмування на З++, ніж були почерпнуті з інших мов.

Більш ранні версії мови, які отримали назву «З класами» [16],

використовувалися, починаючи з 1980 р. Ця мова виникла тому, що автору

треба було написати програми моделювання, керовані перериваннями.

Мова SIMULA-67 ідеально підходить для цього, якщо не враховувати

ефективність. Мова «З класами» використовувався для великих завдань

моделювання. Суворій перевірці піддалися тоді можливості написання на

ньому програм, для яких критичні ресурси часу і пам’яті. У цьому мові

бракувало перевантаження операцій, посилань, віртуальних функцій і багатьох

інших можливостей. Вперше З++ вийшов за межі дослідницької

групи, в якій працював автор, у липні 1983 р. проте тоді багато

можливості З++ ще не були розроблені.

Назва С++ (сі-плюс-плюс). було придумано Ріком Маскитти влітку 1983

р. Ця назва відображає еволюційний характер змін мови С.

Позначення ++ відноситься до операції нарощування С. Трохи більш коротке ім’я

З+ є синтаксичною помилкою. Крім того, воно вже було використано

як назва зовсім іншої мови. Знавці семантики З знаходять, що З++

гірше, ніж ++С. Мова не отримав назви D, оскільки він є

З розширенням, і в ньому не робиться спроб вирішити будь-які проблеми за

рахунок відмови від можливостей С. Ще одну цікаву інтерпретацію назви

З++ можна знайти в додатку до [12].

Спочатку З++ був задуманий для того, щоб автору і його друзям не

треба було програмувати на асемблері, або З інших сучасних мовах

високого рівня. Основне його призначення — спростити та зробити більш

приємним процес програмування для окремого програміста. До

недавнього часу не було плану розробки З++ на папері. Проектування,

реалізація та документування йшли паралельно. Ніколи не існувало

«проекту З++» або «Комітету з розробки С++». Тому мова розвивалася і

продовжує розвиватися так, щоб подолати всі проблеми, з якими

зіткнулися користувачі. Поштовхами до розвитку служать також і обговорення

автором всіх проблем з його друзями і колегами.

У зв’язку з лавиноподібним процесом збільшення числа користувачів С++,

довелося зробити наступні зміни. Приблизно в 1987 р. стало очевидно,

що робота по стандартизації С++ неминуча і що слід негайно

приступити до створення основи для неї [22]. В результаті були зроблені

цілеспрямовані дії, щоб встановити контакт між розробниками

З++ і більшістю користувачів. Застосовувалася звичайна та електронна

електронна пошта, а також було безпосереднє спілкування на конференціях З с++ і

інших зустрічах.

Фірма AT&T Bell Laboratories внесла основний внесок у цю роботу,

надавши автору право вивчати версії довідкового посібника з мови

Короткий опис статті: мова програмування с++ Страуструп Бьярн. Мова програмування С++ Страуструп Бьярн. Мова програмування С++, електронні книги, скачати, завантажити, безкоштовно

Джерело: Страуструп Бьярн. Мова програмування С++

Також ви можете прочитати