reinterpret_cast
إعادة تفسير البتّات reinterpret_cast
reinterpret_cast يعيد تفسير نمط بتّات الذاكرة كنوع مختلف تمامًا بلا أي علاقة منطقية — الأخطر والأقل أمانًا من بين عوامل التحويل، ومخصّص لحالات منخفضة المستوى فقط.
على عكس static_cast، لا يوجد أي منطق تحويل حقيقي هنا — فقط إعادة تسمية لنفس البتّات كنوع آخر (مؤشّر إلى عدد صحيح، أو مؤشّر لنوع إلى مؤشّر لنوع غير مرتبط إطلاقًا). النتيجة قابلة للاستخدام بأمان فقط بإعادة تحويلها لنوعها الأصلي مجددًا؛ أي استخدام آخر غير مضمون النقل بين مترجمات مختلفة. لا يمكنه إزالة const أو volatile — ذلك عمل const_cast حصرًا.
الصياغة
TargetType* p = reinterpret_cast<TargetType*>(sourcePtr); uintptr_t addr = reinterpret_cast<uintptr_t>(ptr);
📄 مثال
int value = 65; int* p = &value; // مؤشّر إلى عدد صحيح — مفيد لدوال تجزئة (hashing) منخفضة المستوى uintptr_t address = reinterpret_cast<uintptr_t>(p); // تحويل بين نوعي مؤشّرات غير مرتبطين — خطر ويستخدم بحذر شديد فقط char* bytes = reinterpret_cast<char*>(p);
أهم النقاط
| العنصر | الوظيفة |
|---|---|
| مؤشّر ↔ عدد صحيح | الاستخدام الأشيع — hashing أو طباعة عنوان الذاكرة |
| مؤشّر ↔ مؤشّر غير مرتبط | بلا أي تحقّق من التوافق — خطر حقيقي |
| لا يزيل const | يفشل ترجمة لو حاولت إزالة const عبره — استخدم const_cast لذلك |
💡 نصائح عملية
- اعتبره الملاذ الأخير — لو تحتاجه بكود عادي (غير أنظمة/شبكات/تشفير)، هذا مؤشّر على مشكلة تصميم أعمق
- النتيجة موثوقة فقط لو أعدت تحويلها لنوعها الأصلي لاحقًا — أي استخدام آخر غير مضمون
⚠️ أخطاء شائعة
- استخدامه لتفادي خطأ نوع بدل فهم سببه وإصلاح التصميم
- الاعتماد على تمثيل بتّات معيّن يفترض بنية ذاكرة محدّدة — قد يختلف بين مترجم وآخر أو معمارية وأخرى
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.