static_cast
التحويل المعروف وقت الترجمة static_cast
static_cast يحوّل بين أنواع مرتبطة منطقيًا — أرقام وتعدادات ومؤشّرات بنفس التسلسل الوراثي — بلا أي تحقّق وقت التشغيل.
static_cast أشيع عوامل التحويل الصريح الأربعة بـ C++. يُستخدم لتحويلات رقمية (int إلى double)، تحويل enum إلى int والعكس، وتحريك مؤشّر بين صنف أساس ومشتقّ ضمن تسلسل وراثي واحد. المهم: لا يوجد أي تحقّق وقت التشغيل — لو استخدمته لتنزيل مؤشّر (base إلى derived) وكان الكائن الفعلي ليس من النوع المشتقّ، النتيجة سلوك غير معرَّف بلا أي تحذير فوري.
الصياغة
TargetType result = static_cast<TargetType>(expression);
📄 مثال
double price = 19.99;
int cents = static_cast<int>(price * 100);
enum class Status { Active, Inactive };
int code = static_cast<int>(Status::Active); // 0
class Animal {};
class Dog : public Animal {};
Animal* a = new Dog();
Dog* d = static_cast<Dog*>(a); // بلا تحقّق — يفترض أن a فعلًا Dogأهم النقاط
| العنصر | الوظيفة |
|---|---|
| تحويل رقمي | بين int وdouble وfloat وما شابه — الاستخدام الأشيع |
| enum إلى/من int | تحويل صريح بين التعداد وقيمته الرقمية |
| تصعيد (upcast) | derived إلى base — آمن دائمًا، ويحصل ضمنيًا أصلًا غالبًا |
| تنزيل (downcast) | base إلى derived — بلا تحقّق، مسؤوليتك أن تضمن صحّته |
💡 نصائح عملية
- فضّله دائمًا على (Type)value القديمة — يوثّق نيّتك ويرفض المترجم تحويلات غير منطقية إطلاقًا بعكس C-style cast
- لو غير متأكّد من نوع الكائن الفعلي بتنزيل، استخدم dynamic_cast بدله رغم كلفته الإضافية
⚠️ أخطاء شائعة
- تنزيل مؤشّر (base إلى derived) دون التأكّد فعليًا من النوع — لا خطأ ترجمة ولا تحقّق تشغيل، فقط سلوك غير معرَّف لاحقًا
- استخدامه لإزالة const من مؤشّر — static_cast لا يفعل هذا؛ المطلوب const_cast
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.