Ещё одна очень
интересная тема - это типы и
преобразования типов.
Здесь в C++ может быть
очень много классных примеров и с очень неожиданными результатами.
Мы тут даже повздорили по этой теме с одним ... преподавателем C++ для начинающих
Но прежде чем писать и показывать примеры нужно выписать основные принципы типизации C++ ... чтоб со знанием дела рассуждать о преобразованиях...
1. В C++ типизация
именная, в отличие от других языков, где типизация может быть
структурная.
При структурной типизации переменные разных типов но описанных
идентичными структурами - совместимы по присвоению.
В C++ если полностью идентичные классы названы
разными именами, то переменные таких типов не совместимы по присвоению.
2. Тип переменной определяет
набор (множество) тех операций и их смысл, которые можно применять к любым переменным данного типа.
Преобразование типа
меняет набор допустимых операций.
Объекты данных (класса) идентичны существительным в разговорном языке, а тип этих данных определяет действия, которые можно применять к таким объектам.
Тип - яблоко: его можно кусать, резать, сушить и др.
Тип - мяч: любым объектом типа мяч можно играть ... но его нельзя кусать.
3. Если
не предусмотрены специальные процедуры преобразования типов (классов), то при статическом преобразовании типа ( static_cast<...>() что мы часто делаем как префикс (type) ) структура объекта данных не меняется.
Примером преобразования данных встроенными типами (пожалуй единственным и
очень неудачным) является преобразование между целыми и вещественными значениями ... да ещё и выполняющиеся
неявно!
Целое 4 преобразованное в вещественное 4.0 получит совершенно иное (floating point) внутреннее представление.
4. Преобразование типов (классов) можно определить явно в коде класса. При этом преобразование может уже проделывать любые трансформации внутреннего представления
объектов классов.
5.
Классы C++ вообще являются продолжением и расширением понятия
тип. Классы C++
не наследуются от какого-то предопределённого класса object (как в Java или Python), поэтому описание класса C++ это просто и ест описание нового типа. Естественное продолжение и ясность это нашло в языке Go, который является прямым наследником C и отчасти C++.
Этих правил достаточно, для того чтобы понимать схему типизации и преобразования типов в C++.
Если я вспомню ещё что-то из основополагающих принципов типизации C++, то буду вписывать
сюда.