Оголошення typedef

Оголошення, що починається з ключового слова typedef, вводить нове ім'я (синонім) для типу, а не оголошує нову змінну цього типу. Формат оголошення typedef наступний:

 

typedef існуючий_тип синонім

 

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

Наприклад:

 

typedef char* pchar;

pchar p1, p2;

char* p3 = p1;

typedef unsigned int uint;

uint i = 42;

 

Найчастіше перейменування типів застосовується для типів даних користувача: переліків, структур і об'єднань. Наприклад:

 

typedef struct mystructtag

{

int i;

double f;

}mystruct;

 

int main()

{

mystruct ms;

ms.i = 10;

ms.f = 0.99;

cout << ms.i <<’n’;

cout << ms.s <<’n’;

}

 

Оголошення typedef не можна використовувати всередині визначень функцій.

2.6 Неявні приведення типів

В одному виразі основні| типи можуть використовуватися разом абсолютно вільно. Значення всюди, де це можливо, перетворюються так, щоб інформація не втрачалася.

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

Припустимо, що наступні присвоювання виконуються на комп'ютері, в якому цілі представляються в додатковому коді, а один символ займає 8 розрядів:

 

int i1 = 256 + 255;

char ch = i1; // ch == 255

int i2 = ch; // i2 == ?

 

У присвоюванні ch = i1 втрачається один найважливіший розряд, а коли присвоюється значення змінній i2, змінна ch має значення зі всіма одиницями, тобто 8 одиничних розрядів. Але яке значення прийме i2, залежить від архітектури комп'ютера. В мові С++ немає динамічних засобів контролю подібних ситуацій, а контроль на етапі компіляції взагалі дуже складний, тому в таких випадках треба бути дуже обережним.

2.7 Явні приведення типів

У мові C++ збереглися традиційні, успадковані від мови C, конструкції явного приведення типів даних. Разом з цим в мову введений новий, заснований на підкреслено складних конструкціях, стиль явного приведення (перетворення) типів.

2.7.1 Традиційний стиль явного приведення типів

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

Наприклад:

 

float r = float(1);

 

Тут перед присвоюванням ціле значення 1 перетвориться в значення з плаваючою крапкою 1.0. Результат приведення типу не є адресою, тому йому присвоювати не можна (якщо тільки тип не є посиланням).

Існують два види запису традиційного приведення типів: операція приведення, що має синтаксис:

 

(type)expr

 

і функціональний запис із синтаксисом:

 

type(expr)

 

В обох варіантах приведення замість type задається цільовий тип, до якого потрібно перетворити значення виразу expr.

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

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

 

char* p = (char*)0777;

 

або визначити нове ім'я:

 

typedef char* pchar;

char* p = pchar(0777);

 

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

Використовуючи явне приведення в тип вказівника можна видати конкретний об'єкт за об'єкт довільного типу. Наприклад, присвоювання:

 

any_type* p = (any_type*)&some_object;

 

дозволить звертатися до деякого об'єкту (some_object) через вказівник p як до об'єкту довільного типу (any_type). Проте, якщо об’єкт some_object насправді має тип не any_type, можуть вийти дивні й небажані результати.

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

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

2.7.2 Приведення типів в стилі мови C++

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