Головна |
типізація - Це спосіб захиститися від використання об'єктів одного класу (типу) замість іншого, або, принаймні, управляти таким використанням.
Ідея узгодження типів займає в понятті типізації центральне місце. Візьмемо, наприклад, фізичні одиниці виміру. Розділивши відстань на час, ми очікуємо отримати швидкість, а не вагу. У множенні температури на силу сенсу немає, а в множенні відстані на силу є. Все це приклади сильної типізації, коли прикладна область диктує правила і обмеження на використання та поєднання абстракцій.
Розглянемо наступний фрагмент:
typedef char * Pchar;
Pchar p1, p2;
char * p3 = p1;
Оскільки оголошення, що починається з ключового слова typedef, вводить нове ім'я для типу, ці імена можна вільно змішувати в обчисленнях. У цьому сенсі C ++ має слабку типізацію.
При перевірці типів у класів C ++ типізований набагато суворіше. Вирази, що містять виклики операцій, перевіряються на узгодження типів під час компіляції.
Важливим поняттям об'єктно-орієнтованого підходу в цілому і мови С ++ зокрема є поліморфізм.
поліморфізм - Це спосіб привласнювати різні значення (смисли) одного й того ж повідомлення. Сенс залежить від типу оброблюваних даних.
Є кілька типів поліморфізму.
Примусове приведення. Функція або оператор працює з декількома різними типами, перетворюючи їх значення до необхідного типу. наприклад,
int i = 1;
double a, b = 4.5;
a = b + i;
В даному прикладі значення змінної i буде перетворено до типу double і результат складання також матиме тип double. Зауважимо, що значення i в пам'яті залишиться незмінним, перетворюється лише тимчасова копія i, яка використовується при обчисленні значення виразу.
Перевантаження. Функція або оператор викликається на основі сигнатури. наприклад,
double a;
a = 1/2; // Цілочисельне ділення, a = 0
a = 1./2 .; // Розподіл дійсних чисел, a = 0.5
Якщо в опис класу ввести визначення функції-члена з ім'ям типу "operator оператор", То це означає, що даний оператор може бути застосований до об'єктів або об'єкту даного класу, так само як і до змінних стандартних типів. При цьому тіло даної функції визначає сенс оператора. наприклад:
class complex {
double re, im;
public:
. . .
complex operator + (complex);
complex operator * (complex);
};
Ми визначили просту реалізацію поняття комплексного кількості: число представляється парою чисел з плаваючою точкою подвійної точності, обчислення здійснюються за допомогою операцій + і *. Тепер, визначивши змінні b і c типу complex, можна записати b + c, що означає (за визначенням) b.operator + (c). В результаті з'являється можливість записувати комплексні вирази у формі, близькій до загальноприйнятої.
Інші типи поліморфізму - Включення і параметричний поліморфізм - Ми розглянемо в п. 4.3 та 4.5 відповідно.
Для здійснення явних перетворень змінних одного типу до іншого типу в С ++ є спеціальні оператори приведення.
Оператор static_cast використовується для перетворення родинних типів і дозволяє провести перетворення типу коректно, переносимо і оборотно. наприклад,
int i;
double a, b;
. . .
а = static_cast
а = static_cast
Оператор reinterpret_cast дозволяє провести явне перетворення між непов'язаними (несумісними) типами. наприклад,
i = reinterpret_cast
Використання модифікатора const призводить до того, що значення змінної не можна змінити. Якщо це обмеження необхідно обійти, використовується оператор const_cast.
Перетворення static_cast передбачає, що типи, які беруть участь в перетворенні, відомі під час компіляції. У випадках коли це не так, використовується оператор приведення dynamic_cast. Дані ситуації ми розглянемо в п. 4.3.
ВСТУП | Складність ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ | Гнучкість програмного забезпечення | абстрагування | інкапсуляція | модульність | збереженість | стан | Поведінка | ідентичність |