تخطَّ إلى المحتوى

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 الكامل بالعربي.