Кафедра 304

Лабораторна робота № 2

на уроках «Програмування»

Виконала студентка 315 гр.

Старцева О.В.

Перевірила доц. кав. 304

Бакуменко Н.С.

________________________

Тема:"СпецифікаціяЗ++"

Мета роботи:Навчитися писати опис основних характеристик програми чи підпрограми. Специфікація завжди включає наступні характеристики: постановка задачі, яка вирішується даною програмою або підпрограмою, опис вихідних даних, опис результатів, опис особливих ситуацій.

Умова:

9.59. Дана пропозиція. Визначити число букв «про»в ньому.

9.101. Дане слово. Поміняти місцями його третю та останню літери.

9.155.У слові є лише дві однакові літери. Знайти їх.

Виконання:

Назва:Vvod

Опис:Функція зчитує з консолі символьне значення.

Вихідні дані:

Назва: 1)symbol; 2) S;

Опис: 1) змінна, якій надається певне значення (якийсь символ); 2) задане речення або слово – параметр підпрограми, що передається з основної програми у вигляді набору символів.

Тип та діапазон: 1) Char, будь-які символи; 2) string, будь-які символи

Результат:функція зчитує дані, введені користувачем з клавіатури.

Виняткові описи:

Опис: 1) введено дані не відповідного типу; 2) введено більше даних, ніж необхідно для програми

Обробка: 1), 2) - виведеться повідомлення у тому, що з побудові програми було виявлено помилки.

Назва:Vuvod

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

Вихідні дані:

Назва: 1) n 2) s; 3) h.

Опис: n, s, h.- змінні, яким надається результат функції (заданої задачі). 1) Підпрограма повертає одне значення – число літер "про"у заданому реченні. 2) Підпрограма повертає масив типу char, у якого поміняні місцями другий та останній елемент (слово, у якому поміняні місцями третя та остання літери). 3) Підпрограма повертає одне значення – букву , яка повторюється у слові.

Типідіапазон: 1) int; 2) string; 3) Char.

Результат:функція виводить на екран результат роботи програми, тобто виводить на екран змінні n, s, h.

Назва: Func

Опис:Визначає число літер «про»у заданому реченні.

Вихідні дані:

Назва: 1) S; 2) simbol; 3) n

Опис: 1) Вихідний масив (задана пропозиція) – параметр підпрограми, що передається з основної програми у вигляді набору символів. 2) змінна, якій надається символ «про»

Тип та діапазон: 1) string, будь-які символи. 2) Char, символ о.

Результат:

Назва: cout

Опис:Підпрограма виводить на друк значення зміною n.

Тип та діапазон Int

Виняткові описи

Опис:пропозиція не містить літери о.

Обробка:виводиться повідомлення, що речення не містить букви о.

Назва: Func1

Опис:функція змінює місцями третю та останню літери заданого користувачем слова.

Вихідні дані:

Назва: 1) S; 2) l, k 3) temp; 4) s

Опис: 1) Вихідний масив (задане слово) – параметр підпрограми, що передається з основної програми у вигляді набору символів. 2) змінна якій надається значення другого елемента масиву. 2) змінні, яким присвоюються індекси третьої та останньої літери заданого слова. 3) змінна, якій спочатку надається значення другого елемента масиву, потім під час роботи програми відбувається переприсвоєння.

Тип та діапазон: 1) string, будь-які символи; 2) int 3) int.

Результат:

Назва: cout

Опис:Підпрограма виводить на друк значення зміною s

Тип та діапазон: string.

Виняткові описи

Опис: 1) не коректне завдання масиву; 2) індекси задані не відповідного типу.

Обробка: 1),2) - виведеться повідомлення у тому, що з побудові програми було виявлено помилки.

Назва: Func2

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

Вихідні дані:

Назва: 1) S; 2) h.

Опис: 1) Вихідний масив (задане слово) – параметр підпрограми, що передається з основної програми у вигляді набору символів.

Тип та діапазон: 1) char

Результат:

Назва: cout

Опис:Підпрограма виводить на друк значення зміною h.

Тип та діапазон: char.

Виняткові ситуації:

Опис: 1) у слові не міститься однакових літер 2) слово складається з усіх однакових літер 3) не коректне завдання масиву

Обробка: 1), 2) – виводиться число «-1». 3) виведеться повідомлення про те, що при побудові програми виявлено помилки.

Мастильні матеріали почали використовуватися ще задовго до нашої ери. І якщо раніше як них застосовувалися рослинні жири та жири тваринного походження, то починаючи з 60-х років минулого століття їх замінили продукти нафтопереробки. Після цього почався активний розвиток і вдосконалення моторних масел, а близько 70 років тому з'явилися перші полімерні модифікатори в'язкості, завдяки яким незабаром у моторних оліях з'явилися різні класи та різновиди, що відповідають температурному режиму певної пори року, а також з'явилися всесезонні види мастильних матеріалів.

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

На сьогоднішній день існує кілька систем класифікації масел, які дозволяють розділити мастильні матеріали за їх експлуатаційними якостями, технічними характеристиками, а також за призначенням. Серед основних загальноприйнятих систем однією з найвідоміших є класифікація моторних масел API. Вона була введена наприкінці 50-х років нашого століття Американським Інститутом Нафти, і основним принципом у ній є класифікація за двома категоріями – S і C, тобто для бензинових та дизельних двигунів відповідно.

Специфікації масел S та C

Як вже зазначено вище, система API передбачає розподіл на дві основні категорії, проте існує і третє позначення якості мастильних матеріалів. З них кожен вид є самостійним:

Всі ці стандарти позначаються індексом із двох букв, наприклад, SN, SM, SH, SG, CF, CI, де друге значення є показником за рівнем експлуатаційних характеристик. При цьому, чим ближче до кінця латинського алфавіту знаходиться літера, що є в позначенні, тим вищий рівень масла API. Наприклад, таке позначення продукту як API SL, SM або SN означає перевагу над API SF.

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

ГрупаОпис
SNМастильні матеріали SN відрізняються від попередніх цієї категорії SM специфікацій тим, що в них міститься набагато менше фосфору, що наділяє їх додатковими енергозберігаючими якостями та робить SN сумісними з новітніми системами, спрямованими на нейтралізацію вихлопних газів. Клас SN затверджений восени 2010 року і застосовується в двигунах найсучасніших автомобілів. Варто відзначити, що масла зі специфікацією API SN за своїми характеристиками близькі ACEA C2, C3, C4, тому SN можуть успішно замінювати мастило класу SM.
SMSM вперше запровадили наприкінці 2004 року. Цей клас сьогодні більш поширений, ніж CN, адже він призначається для сучасних бензинових двигунів, включаючи багато клапанні та турбовані двигуни. Змащення цієї категорії розроблялося з урахуванням вдосконалення двигунів, тому покликане підвищувати їх екологічну безпеку і бути більш зносостійким. SM відрізняється від попередньої категорії SL більшою стійкістю до окислення чудовими захисними властивостями від утворення осадом та відкладень, що безумовно позначається на високій якості мастильних матеріалів. Через два роки після випуску SM була розроблена категорія масел для дизельних двигунів із позначенням CJ4.
Продукти специфікації SM призначені для автомобілів з 2004 року випуску та розроблені саме для них.
SLКлас SL був розроблений незадовго до виходу SM та SN. Він розроблений для двигунів автомобілів, випущених з 2001 року, і абсолютно відповідає всім сучасним стандартам та вимогам, включаючи високу екологічність та енергозбереження. SL призначаються для сучасних моторів, у тому числі багатоклапанних, турбованих та двигунів, пристосованих для роботи на збіднених сумішах палива. На мастильних матеріалах групи SL можуть працювати і двигуни, для яких призначені продукти категорії SJ.
Завдяки таким властивостям, як знижена летючість, SL відрізняються довгим збереженням своїх якостей, завдяки чому інтервал заміни моторної олії помітно збільшується. На сьогоднішній день ця категорія діє і широко застосовується сучасними автовласниками.
SJЦей клас також діє на сьогоднішній день. Його затвердили у листопаді 1995 року, хоча сертифікацію продукт пройшов лише через рік. Тому олії категорії SJ використовують для автомобілів із бензиновим двигуном, починаючи з 1996 року випуску. Їх успішно застосовують у моторах легкових та спортивних авто, а також у двигунах мікроавтобусів та невеликих вантажних машин.
SJ показує хороші технічні характеристики, у тому числі стійкість до утворення опадів та нагару, а також здатність зберігати свої властивості за знижених температур. За цими властивостями олії категорії SJ дуже близькі до продуктів класу SH, тому цілком придатні для використання в тому випадку, коли виробником рекомендовано використання для машини олії категорії SH.
SHЦя категорія була створена у 1992 році і вважається умовно чинною. Масла, що входять до цієї групи, використовуються в двигунах автомобіля 1996 року випуску і раніше. За своїми якостями цей клас перевершує мастила категорії SG, адже він розроблявся з метою її замінити. Тому олії класу SH успішно використовуються для автомобілів, у яких рекомендується застосовувати SG.
SGКлас SG призначений для моторів, випущених в 1193 і раніше. Олії цієї категорії відрізняються чудовим захистом від нагару і стійкі до процесів окиснення та утворення корозії. Мастила SG відповідають усім вимогам для моторних масел, призначених для дизельних двигунів API CC, а значить SG можуть застосовуватися для машин, у яких виробник рекомендує використовувати категорії SF та SF/CC, а також SE та SE/CC.

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

Серед сучасних специфікацій моторних масел найбільшою популярністю користуються олії класу CI та CF. Саме вони розроблені з урахуванням усіх особливостей сучасних дизельних моторів та відповідають усім стандартам.

CIКатегорія CI-4 затверджено у 2002 році. Вони розраховані на різні дизельні мотори, продукти специфікації CI мають високу стійкість до окислення і містять диспергуючі присадки. CI досить екологічні, у порівнянні з попередніми класами олій. Варто відзначити, що із загальної категорії CI виділяють ще один клас – CI-4 PLUS. Удосконалений клас CI-4Plus виведений з урахуванням жорстких вимог до випаровування олії, її окиснення при підвищених температурах та утворення нагару.
CFСпецифікація CF призначена для дизельних двигунів з непрямим упорскуванням. Вони відрізняються високим вмістом різних присадок, які запобігають відкладенням на поршнях, а також захищають від зносу та утворення корозії внутрішніх деталей із вмістом міді, наприклад, підшипників.
Клас CF може мати позначення CF-4 і CF-2, що означає автомастила, що передбачають застосування в чотиритактних та двотактних (відповідно) дизельних двигунах.
При цьому CF-4 розраховані на двигуни, що працюють у прискореному режимі, а CF-2 ідеально підходять для моторів, які постійно зазнають підвищених навантажень.

Відео «Класифікації API»

Загальномовна специфікація CLS

Як відомо, у різних мовах програмування одні й самі програмні конструкції виражаються своїм унікальним, специфічним для конкретної мови образом. Наприклад, в C# конкатенація рядків позначається за допомогою знака "плюс" (+), а VB для цього зазвичай використовується амперсанд (&). Навіть у разі вираження у двох відмінних мовах однієї і тієї ж програмної ідіоми (наприклад, функції, що не повертає значення), дуже висока ймовірність того, що на вигляд синтаксис виглядатиме дуже по-різному.

Як уже показувалося, подібні невеликі варіації в синтаксисі для виконуючого середовища. Однак мови можуть відрізнятися і за загальним рівнем функціональних можливостей. Наприклад, якоюсь мовою .NET може бути або не бути ключового слова для представлення даних без знака, а також підтримуватися або не підтримуватися типи покажчиків. З-за всіх таких можливих варіацій було б просто чудово мати в розпорядженні якісь опорні вимоги, яким мали б відповідати всі підтримуючі.NET мови.

CLS (Common Language Specification – загальна специфікація для мов програмування)якраз і є набором правил, які у всіх подробицях описують мінімальний і повний комплект функціональних можливостей, які повинен обов'язково підтримувати кожен окремо взятий.NET-компілятор для того, щоб генерувати такий програмний код, який міг би обслуговуватися CLR і до якого в тому Водночас могли б однаково отримувати доступ усі мови, орієнтовані на платформу.NET. Багато в чому CLS може вважатися просто підмножиною всіх функціональних можливостей, визначених у CTS.

Зрештою, CLS є свого роду набором правил, яких повинні дотримуватися творці компіляторів за бажання, щоб їх продукти могли без проблем функціонувати у світі.NET. Кожне з цих правил має просту назву (наприклад, "Правило CLS номер 6") і описує, яким чином його дія стосується тих, хто створює компілятори, і тих, хто (будь-яким чином) буде взаємодіяти з ними. Найголовнішим у CLS є правило 1, що говорить, що правила CLS стосуються лише тих частин типу, які робляться доступними за межами складання, в якому вони визначені .

З цього правила можна (і потрібно) дійти невтішного висновку у тому, що й інші правила в CLS не поширюються на логіку, застосовувану для побудови внутрішніх робочих деталей типу.NET. Єдиними аспектами типу, які мають відповідати CLS, є самі визначення членів(Тобто угоди про іменування, параметри та типи, що повертаються). У рамках логіки реалізації члена може застосовуватися будь-яка кількість і не узгоджених із CLS прийомів, оскільки для зовнішнього світу це не відіграватиме жодної ролі.

Наприклад, візьмемо чутливість до регістру. Мова IL чутлива до регістру символів. Розробники, які пишуть мовами, чутливих до регістру, широко використовують гнучкість, яку забезпечує ця залежність від регістру, під час виборів імен змінних. Однак мова Visual Basic 2010 не є чутливою до регістру символів. Специфікація CLS обходить цю проблему вказуючи, що будь-який CLS-сумісний код не повинен включати жодних пар імен, що відрізняються лише регістром символів. Таким чином, Visual Basic 2010 може працювати з CLS-сумісним кодом.

Цей приклад ілюструє, що CLS працює двома способами.

Опис використовується для інтерпретації кожного з ідентифікаторів; необов'язково, щоб вони супроводжувалися виділенням пам'яті, що зіставляється з ідентифікатором. Опис має вигляд

специфікації-описи opt список-описувачів opt;
визначення-функції
специфікація-зв'язку

Описувачі у списку-описувачів (§R.8) містять ідентифікатори, що описуються. Конструкція специфікації-опису може бути відсутня лише у визначенні функцій (§R.8.3) або в описі функцій. Список-описувачів може бути порожнім, лише при описі класу (§R.9) або перерахування (§R.7.2), тобто. коли специфікація-опис є специфікація-класу або специфікація-перерахування. Конструкція опис-asm пояснюється §R.7.3, а специфікація-зв'язку в §R.7.4. Опис відбувається у певній області видимості (§R.3.2), правила області видимості наводяться у §R.10.4.

R.7.1 Специфікації

В описі можна використовувати такі специфікації:

специфікація-описи:
специфікація-класу-пам'яті
специфікація-типу
специфікація-шаблону-типу
специфікації-описи:
специфікації-опису opt специфікація-опису

Найдовша послідовність конструкцій специфікації-опису, яка, можливо, є ім'ям типу, утворює в описі конструкцію специфікації-опису. Послідовність має бути узгодженою, що пояснюється нижче. Наприклад,

static Pc; // помилка: немає імені

Тут опис static Pc є незаконним, оскільки не вказано жодного імені статичної змінної типу Pc. Щоб мати змінну типу int з ім'ям Pc, необхідно встановити специфікацію-типу int, щоб показати, що (пере)визначається ім'я Pc з typedef, а не просто Pc є одним з елементів послідовності конструкцій специфікація-опису, наприклад,

void f(const Pc); // void f (char * const)
void g(const int Pc); // void g(const int)

Вкажемо, що оскільки signed, unsigned, long і short за умовчанням трактуються як int, конструкція ім'я-typedef, яка з'являється після однієї з перерахованих специфікацій типу, повинна задавати (пере)визначене ім'я, наприклад,

void h(unsigned Pc); // void h (unsigned int)
void k(unsigned int Pc); // void k(unsigned int)

R.7.1.1 Специфікації класу пам'яті

Специфікації класу пам'яті можуть бути такі:

специфікація-класу-пам'яті:

Специфікації auto і register можуть застосовуватись тільки для імен об'єктів, описаних у блоці (§R.6.3), або для формальних параметрів (§R.8.3). Майже завжди специфікація auto є надмірною і використовується не часто, так, auto використовується, щоб явно відокремити оператор-опис від оператора-вираження (§R.6.2).

Опис register є описом auto, яке підказує транслятору, що такі змінні будуть використовуватися досить інтенсивно. Підказка може бути проігнорована, і в багатьох реалізаціях вона ігнорується у тому випадку, коли береться адреса змінної.

Опис об'єкта вважається визначенням, якщо воно не містить специфікації extern та ініціалізації (§R.3.1).

Визначення призводить до виділення пам'яті відповідного розміру та виконання відповідної ініціалізації (§R.8.4).

Специфікації static і extern можуть застосовуватися лише до імен об'єктів чи функцій або анонімним об'єднанням. Усередині блоку неприпустимі описи функцій зі специфікацією static чи формальних параметрів зі специфікацією static чи extern. Статичні члени класу описуються у §R.9.4. Специфікація extern є неприпустимою для членів класу.

Ім'я зі специфікацією static підлягає внутрішньому зв'язуванню. Об'єкти, описані як const, підлягають внутрішньому зв'язуванню, якщо вони не були описані із зовнішнім зв'язком. Ім'я зі специфікацією extern підлягає зовнішньому зв'язуванню, якщо раніше воно було описано з внутрішнім зв'язком. Ім'я з файловою областю видимості і без специфікації-класу-пам'яті підлягає зовнішньому зв'язуванню, якщо раніше воно не було описане з внутрішнім зв'язком або зі специфікацією const. У зв'язку з функціями, що не є членами, специфікація inline еквівалентна static (§R.3.3). Для одного імені всі його специфікації, що визначають зв'язування, мають бути узгоджені. Наприклад,

static char * f (); // f() має внутрішнє зв'язування
char* f() // f() все ще внутрішнє
char * g (); // g() має зовнішнє зв'язування
static char* g() // помилка: суперечність у зв'язуванні
static int a; // `a” має внутрішнє зв'язування
int a; // Помилка: друге визначення
static int b; // `b" має внутрішнє зв'язування
extern int b; // `b" все ще внутрішнє
int c; // `c' має зовнішнє зв'язування
static int c; // помилка: протиріччя зв'язуванні
extern int d; // `d' має зовнішнє зв'язування
static int d; // помилка: протиріччя зв'язуванні

Ім'я невизначеного класу можна використовувати у описі extern. Однак, такий опис не можна використовувати перш, ніж клас буде визначено, наприклад,

g(a); // помилка: S невизначено
f(); // помилка: S невизначено

R.7.1.2 Специфікації функцій

Деякі специфікації можна використовувати лише у описі функцій.

Специфікація inline нагадує транслятору, що потрібно зробити підстановку тіла функції замість звичайної реалізації виклику функції. Підказка може ігноруватись. У разі функцій, які не є членами, специфікація inline додатково встановлює для функції внутрішнє зв'язування (§R.3.3). Функція (§R.5.2.2, §R.8.2.5), визначена в описі класу, має за промовчанням специфікацію inline.

Функція-член зі специфікацією inline повинна мати точно таке ж визначення в кожній одиниці трансляції, де вона з'являється.

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

inline int g(); // X::g() має внутрішнє зв'язування

int i = p-›f(); // тепер X::f() зовнішнє зв'язування

inline int X::f() // помилка: виклик до визначення

inline int X::h() // тепер X::h() має внутрішнє зв'язування

Специфікація virtual може використовуватися лише в описах нестатичних функцій-членів при описі класу (див. §R.10.2).

R.7.1.3 Специфікація typedef

Описи зі специфікацією typedef визначають ідентифікатори, які пізніше можуть використовуватися для позначення основних або похідних типів. Специфікація typedef неприпустима у визначенні-функції (§R.8.3).

В межах області видимості (§R.3.2) опису typedef будь-який ідентифікатор, що з'являється в частині будь-якого з описувачів, стає синтаксично еквівалентним службовому слову і позначає тип, пов'язаний з цим ідентифікатором, як описано в §R.8. Таким чином, ім'я-typedef є синонімом іншого типу. На відміну від опису класу (§R.9.1) ім'я-typedef не додає нового типу. Наприклад, після опису

конструкції

є законними описами, тип distance є int, а metricp тип "покажчик на int".

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

typedef struct s (/*… */) s;

Безіменний клас, який визначається в typedef, отримує в якості свого імені ім'я, використане в typedef, наприклад,

typedef struct (/*… */) S; // ім'я структури стало S

За допомогою опису typedef не можна перевизначити ім'я типу, описаного в цій же області видимості, так, щоб воно позначало інший тип, наприклад,

typedef int complex; // помилка: перевизначення

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

class complex (/*… */); // помилка: перевизначення

Ім'я-typedef, яке означає клас, є ім'ям-класу (§R.9.1). Синонім не можна використовувати після наступних префіксів: class, struct і union, а також в іменах конструкторів та деструкторів в описі самого класу, наприклад,


S = T(); // нормально

R.7.1.4 Специфікація шаблону типу

Специфікація шаблону типу використовується для завдання сімейства типів або функцій (див. §R.14).

R.7.1.5 Специфікація friend

Специфікація friend використовується для завдання доступу до членів класу (див. §R.11.4).

R.7.1.6 Специфікація типу

До специфікації типу належать:

специфікація-типу:
ім'я-простого-типу
специфікація-класу
специфікація-перерахування
специфікація-складного-типу

При описі об'єкта службові слова const та volatile можна додати до будь-якої законної специфікації типу. У всіх інших випадках в описі може бути не більше однієї специфікації типу. Об'єкт зі специфікацією const можна ініціалізувати, але його значення не повинно змінюватись надалі. Об'єкт зі специфікацією const, якщо він не був явно описаний як extern, не підлягає зовнішньому зв'язуванню і повинен ініціалізуватися (§R.8.4, §R.12.1). Ціле зі специфікацією const, ініціалізоване виразом-константою, може використовуватися у виразі-константі (§R.5.19). Кожен елемент масиву зі специфікацією const має ту ж специфікацію, а кожен нестатичний член, який не є функцією, з об'єкта класу зі специфікацією const сам вважається const (§R.9.3.1). Об'єкт типу без конструктора або деструктора, який має специфікацію const, може бути поміщений у пам'ять, доступну лише читання. Спроба запису в будь-яку частину такого об'єкта або призведе до особливої ​​адресної ситуації, або пройде безслідно, якби об'єкт не мав специфікації const.

Немає залежить від реалізації пояснення об'єктів зі специфікацією volatile. Вона служить підказкою транслятору уникати надто активної оптимізації, пов'язаної з цим об'єктом, оскільки значення об'єкта може змінюватись способами, прихованими від транслятора. Кожен елемент масиву зі специфікацією volatile має ту ж специфікацію і кожен нестатичний член, який не є функцією, з об'єкта класу зі специфікацією volatile сам вважається volatile (§R.9.3.1).

Якщо специфікація типу відсутня в описі, вона вважається заданою як int.

ім'я-простого-типу:
повне-ім'я-класу
уточнене-ім'я-типу

Разом з int не можна ставити більше одного службового слова long або short. Вони можуть використовуватись і поодинці, тоді вважається, що тип є int. Службове слово long може з'явитися разом із double. Разом з char, short, int або long не можна ставити більше одного службового слова signed або unsigned. Вони можуть використовуватись і поодинці, тоді вважається, що тип є int. Специфікація signed вказує, що об'єкти типу char та бітові поля є знаковими, для інших цілих типів ця специфікація надмірна.

Конструкції специфікація-класу та специфікація-перерахування визначаються у §R.9 та §R.7.2 відповідно.

специфікація-складного-типу:
службове-слово-класу ім'я-класу
службове-слово-класу ідентифікатор
службове-слово-класу:

Якщо заданий ідентифікатор, специфікація-складного типу описує його як ім'я-класу (див. §R.9.1).

Якщо визначено ім'я, яке описується за допомогою специфікації union, воно має бути визначене як об'єднання. Якщо визначено ім'я, яке описується за допомогою специфікації class, воно має бути визначене за допомогою специфікацій class або struct. Якщо визначено ім'я, яке описується за допомогою специфікації struct, то воно має бути визначене за допомогою специфікації class або struct. Імена вкладених типів (§R.9.7) повинні уточнюватися іменем об'ємного класу:

уточнене-ім'я-типу:
ім'я-класу:: уточнене-ім'я-типу
повне-ім'я-класу:
уточнене ім'я-класу
:: уточнене ім'я класу
уточнене ім'я-класу:
ім'я-класу:: уточнене-ім'я-класу

Ім'я, уточнене ім'ям-класу, має бути типом, визначеним у цьому класі або в базовому класі цього класу. Як звичайно, ім'я, описане у похідному класі, робить невидимими члени з цим ім'ям з базових класів (див. §R.3.2).

R.7.2 Опис перерахування

Перерахування є окремим цілим типом (§R.3.6.1) з константами-іменами. Його ім'я у сфері видимості стає конструкцією имя-перечисления, тобто. служить зарезервованим словом.

ім'я-перерахування:
специфікація-перерахування:
enum ідентифікатор opt ( список-перерахування )
список-перерахування:
елемент-перерахування
список-перерахування, елемент-перерахування
елемент-перерахування:
ідентифікатор = вираз-константа

Усі ідентифікатори зі списку-перерахування вважаються описаними як константи і можуть з'являтися всюди, де потрібні константи. Якщо було елементів перерахування з =, то значення констант починаються з нуля і послідовно збільшуються на одиницю у міру просування у списку зліва направо. Якщо елемент перерахування зустрівся з =, його ідентифікатор приймає задане значення, а наступні ідентифікатори без ініціалізуючої частини будуть отримувати зростаючі значення, починаючи з заданого. Значення елемента перерахування має бути типу int або значенням, яке можна привести до int за допомогою стандартних цілісних перетворень (§R.4.1).

Імена елементів перерахування повинні бути відмінними від імен звичайних змінних та інших елементів перерахування тієї ж області видимості. Значення елементів перерахування нічого не винні відрізнятися друг від друга. Вважається, що елемент перерахування описаний з моменту появи його ідентифікатора або значення, що ініціалізує, (якщо воно є). Наприклад, у визначеннях

значення a, c, d задані як 0, b і e як 1, а f як 3.

Кожне перерахування є цілим типом, який відмінний від усіх інших цілісних типів. Типом елемента перерахування вважається цей перелік. Значення елемента перерахування або об'єкта типу перерахування перетворюється на ціле за допомогою стандартних цілісних перетворень (§R.4.1). Наприклад, у наступному фрагменті:

enum color (red, yellow, green=20, blue);

color заданий як цілий тип, що описує різні кольори, col описаний як об'єкт цього типу, а cp як покажчик на об'єкт цього типу. Можливі значення об'єкта типу color є red, yellow, green, blue. Ці значення можна перетворити на цілі значення 0, 1, 20 і 21. Оскільки кожне перерахування - це окремий тип, об'єкту типу color можна надавати тільки значення типу color, наприклад,

color c = 1; // помилка: невідповідність типів
// немає перетворення від int на color
int i = yellow; // нормально: yellow перетворюється на int зі значенням 1
// стандартне цілісне перетворення

Зверніться також до §R.18.3.

Елементи переліку, визначені в класі (§R.9), відносяться до області видимості цього класу, і до них можна звертатись ззовні функцій-членів цього класу лише за допомогою явного уточнення іменем класу (§R.5.1). Ім'я самого типу перерахування локальне у цьому класі (§R.9.7), наприклад,

список-описів:
список описів опис

Необхідне зв'язування визначається за допомогою рядка-літералу. Її призначення визначається реалізацією. Але у всіх реалізаціях має бути передбачено зв'язування з функцією мовою C ("C") та з функцією мовою C++ ("C++"). За замовчуванням зв'язування задається як "C++", наприклад,

complex sqrt(complex); // за умовчанням зв'язування із C++
double sqrt(double); // зв'язування з C

Специфікації зв'язку може бути вкладеними. Специфікація зв'язку не визначає область видимості. Специфікація зв'язку може зустрітися тільки у файловій області видимості (§R.3.2). Специфікація зв'язку для класу відноситься до об'єктів, описаних у ньому, і функцій, що не є членами. Специфікація-зв'язку, що відноситься до деякої функції, відноситься і до всіх об'єктів та функцій, описаних у ній. Опис зв'язку, що містить невідомий для реалізації рядок, вважається хибним.

Якщо функція має більше однієї специфікації-зв'язку, вони мають бути узгоджені, тобто. ставити той самий рядок-літерал. Опис функції без зазначення специфікації зв'язку не повинен передувати першій вказівці специфікації зв'язку для цієї функції. Функція може бути описана без вказівки специфікації зв'язку навіть після явної вказівки специфікації зв'язку, але зв'язування, явно задане більш ранньому описі, не буде усунуто таким описом функції.

З багатьох перевантажених функцій (§R.13) з цим ім'ям не більше однієї може мати зв'язування з мовою C, див. §R.7.4.

Зв'язування можна встановити для об'єктів, наприклад:

int _flsbuf(unsigned,_iobuf*);

Коли визначається специфікація зв'язку, то функції та об'єкти можна описати як статичні всередині ( ). Для таких функцій або об'єктів ігнорується команда зв'язування. Інакше, функція, описана при заданні зв'язку, трактується, якби вона була явно описана як extern, наприклад, нижче другий опис помилково (§R.7.1.1):

static double f(); // помилка

Об'єкт, описаний усередині конструкції

все ж таки вважається певним, а не просто описаним.

Зв'язування об'єктів на C++ з об'єктами, визначеними іншими мовами, як і зворотне зв'язування, залежить від мов та реалізації. Таке зв'язування можливе лише в тому випадку, коли алгоритми розміщення об'єктів у пам'яті є схожими для двох мов.

Якщо для завдання зв'язку в рядку-літералі зі специфікації зв'язку використовується ім'я мови програмування, то рекомендується, щоб написання цього імені копіювалося з документа, що визначає цю мову, наприклад, Ada (а не ADA) і Fortran (а не FORTRAN).