Типтерди айландыруу жана кастинг
Бир типти экинчисине айландыруу - коопсуз, атайылап жана чын эле кааласаң гана
int ти double ко, базалык класстын көрсөткүчүн туунду класстын көрсөткүчүнө, API дескрипторун бүтүн санга. Бул айландыруулардын бир бөлүгү көзгө көрүнбөй болот (компилятор аларды өзү коёт), ал эми бир бөлүгүн сен кастинг менен ачык суранышың керек. Компилятор сенин артыңдан кайсы айландырууларды жасаарын, ал эми сен башкарууну колго алганда төрт аталган кастингдин кайсынысын тандаарыңды билүү - тууралыгы далилденген код менен маалыматты тынч бузган коддун ортосундагы айырма.
- кыйыр айландырууларды таанып, коркунучтуу тарытууну байкоону,
- каалабаган айландырууларды токтотуу үчүн
explicitачкыч сөзүн колдонууну, static_cast,dynamic_cast,const_castжанаreinterpret_castтин ортосунан туура тандоону,- заманбап C++ те эски C стилиндеги
(T)xкастинги эмне үчүн сунушталбаарын түшүндүрүүнү.
1. Кыйыр айландыруулар жана тарытуу
Кыйыр айландыруу - бул компилятор автоматтык түрдө, сен кастинг жазбастан аткарган айландыруу. Алардын көбү зыянсыз жана пайдалуу: int ти double ко ыйгаруу же int күтүлгөн жерге char берүү. Булар жогорулатуу же кеңейтүү айландыруулары - кабылдоочу тип баштапкы типтин ар бир маанисин чагылдыра алат, ошондуктан эч нерсе жоголбойт.
Коркунуч - тескери багытта: тарытуучу айландыруу, мында кабылдоочу тип баштапкы типтин ар бир маанисин сактай албайт. double ту int ке ыйгаруу бөлчөк бөлүгүн ыргытат; чоң int ти short ко ыйгаруу ашып кетип, маанисиз санга айланышы мүмкүн. Компилятор адатта муну үнсүз уруксат берет жана эң жакшы дегенде эскертүү чыгарат.
double pi = 3.14159;
int n = pi; // тарытуу: n 3 болот, .14159 бөлүгү жоголот
long big = 100000;
short s = big; // тарытуу: ашып кетиши мүмкүн, маани реализацияга көз каранды
Заманбап C++ сага коопсуздук берет: фигуралык кашаа менен инициализациялоо {} тарытуучу айландырууну үнсүз тосин эмес, компиляция катасына айлантат. Бул инициализация үчүн фигуралык кашааны артык көрүүнүн эң мыкты себептеринин бири.
int a = 3.9; // компиляцияланат: a 3 ке барабар (үнсүз тарытуу)
int b{3.9}; // КАТА: { } ичинде тарытуучу айландырууга уруксат жок
Кыйыр айландыруулар айландыруучу конструкторлор аркылуу да болот. Эгер класста бир аргументтүү конструктор болсо, компилятор аны колдонуп, ошол аргументтин типин сенин классыңа үнсүз айландырышы мүмкүн - кийинки бөлүм так ушуну башкарууну үйрөтөт.