Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Типизация – это способ защититься от использования объектов одного класса (типа) вместо другого, или, по крайней мере, управлять таким использованием.
Идея согласования типов занимает в понятии типизации центральное место. Возьмем, к примеру, физические единицы измерения. Разделив расстояние на время, мы ожидаем получить скорость, а не вес. В умножении температуры на силу смысла нет, а в умножении расстояния на силу есть. Все это примеры сильной типизации, когда прикладная область диктует правила и ограничения на использование и сочетание абстракций.
Рассмотрим следующий фрагмент:
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 < double > (i);
а = static_cast < double > (static_cast < int > (b) + 1);
Оператор reinterpret_cast позволяет провести явное преобразование между несвязанными (неродственными) типами. Например,
i = reinterpret_cast < int > (&x);// системно-зависимое
Использование модификатора const приводит к тому, что значение переменной нельзя изменить. Если данное ограничение необходимо обойти, используется оператор const_cast.
Преобразование static_cast предполагает, что типы, участвующие в преобразовании, известны во время компиляции. В случаях когда это не так, используется оператор приведения dynamic_cast. Данные ситуации мы рассмотрим в п. 4.3.
Дата публикования: 2015-04-06; Прочитано: 424 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!