Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ทำไมต้องใช้ static_cast<int>(x) แทน (int)x ใน C++?


(int)x เป็น C-style typecasting ในขณะที่ static_cast<int>(x) ใช้ใน C++ static_cast<>() ให้การตรวจสอบที่ compile-time (เวลาคอมไพล์) แต่ C-style casting ไม่รองรับการตรวจสอบนี้ static_cast<>() สามารถเห็นได้ชัดเจนที่ไหนก็ตามในโค้ด C++ และการใช้ C++ cast นี้สื่อความตั้งใจได้ชัดเจนกว่า

ใน C-style cast บางครั้งเราสามารถ cast pointer บางชนิดไปชี้ข้อมูลชนิดอื่นได้ เช่น integer pointer สามารถชี้ character type data ได้ เพราะพวกมันค่อนข้างคล้ายกัน แตกต่างกันแค่ character มี 1-byte integer มี 4-bytes ใน C++ static_cast<>() เข้มงวดกว่า C-style casting มันแปลงระหว่าง compatible types เท่านั้น

ตัวอย่างโค้ด

char c = 65; //1-byte data. ASCII of 'A'
int *ptr = (int*)&c; //4-byte

เนื่องจาก pointer 4-byte ชี้ไปยังหน่วยความจำที่จัดสรรเพียง 1-byte อาจสร้าง runtime error หรือ overwrite หน่วยความจำที่อยู่ติดกัน

ใน C++ static_cast<>() จะอนุญาตให้คอมไพเลอร์ตรวจสอบว่า pointer และข้อมูลเป็นชนิดเดียวกันหรือไม่ หากไม่ใช่ จะยกเว้น incorrect pointer assignment exception ระหว่างการคอมไพล์

char c = 65; //1-byte data. ASCII of 'A'
int *ptr = static_cast<int>(&c);

สิ่งนี้จะสร้าง compile-time error