Типизация.
Объектно-ориентированное программирование
Если в описание класса ввести определение функции-члена с именем типа «operator оператор», то это означает, что данный оператор может быть применен к объектам или объекту данного класса, так же как и к переменным стандартных типов. При этом тело данной функции определяет смысл оператора. Например: В данном примере значение переменной i будет преобразовано к типу double и результат сложения также… Читать ещё >
Типизация. Объектно-ориентированное программирование (реферат, курсовая, диплом, контрольная)
Типизация — это способ защититься от использования объектов одного класса (типа) вместо другого, или, по крайней мере, управлять таким использованием.
Идея согласования типов занимает в понятии типизации центральное место. Возьмем, к примеру, физические единицы измерения. Разделив расстояние на время, мы ожидаем получить скорость, а не вес. В умножении температуры на силу смысла нет, а в умножении расстояния на силу есть. Все это примеры сильной типизации, когда прикладная область диктует правила и ограничения на использование и сочетание абстракций.
Рассмотрим следующий фрагмент:
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 = ½; // целочисленное деление, 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+©. В результате появляется возможность записывать комплексные выражения в форме, близкой к общепринятой.
Другие типы полиморфизма — включение и параметрический полиморфизм — мы рассмотрим в п. 4.3 и 4.5 соответственно.
Для осуществления явных преобразований переменных одного типа к другому типу в С++ имеются специальные операторы приведения.
Оператор static_cast используется для преобразования родственных типов и позволяет провести преобразование типа корректно, переносимо и обратимо. Например,.
int i;
double a, b;
.. .
а = static_cast (i);
а = static_cast (static_cast (b) + 1);
Оператор reinterpret_cast позволяет провести явное преобразование между несвязанными (неродственными) типами. Например,.
i = reinterpret_cast (&x);// системно-зависимое Использование модификатора const приводит к тому, что значение переменной нельзя изменить. Если данное ограничение необходимо обойти, используется оператор const_cast.
Преобразование static_cast предполагает, что типы, участвующие в преобразовании, известны во время компиляции. В случаях когда это не так, используется оператор приведения dynamic_cast. Данные ситуации мы рассмотрим в п. 4.3.