const_cast
إضافة أو إزالة const const_cast
const_cast العامل الوحيد المخصّص لتعديل صفة const أو volatile فقط، دون تغيير النوع الأساسي للمؤشّر أو المرجع.
يُستخدم غالبًا لمطابقة توقيع دالة قديمة (legacy) لا تقبل const رغم أنها لا تعدّل المعامل فعليًا. مهم جدًا: const_cast آمن فقط لو الكائن الأصلي لم يُعرَّف const من الأساس (مثل معامل بمرجع ثابت لكائن غير ثابت أصلًا). تعديل قيمة عبر const_cast على كائن أُنشئ const فعليًا من البداية سلوك غير معرَّف.
الصياغة
Type* p = const_cast<Type*>(constPtr); Type& r = const_cast<Type&>(constRef);
📄 مثال
void legacyPrint(char* text) { /* دالة قديمة لا تقبل const char* */ }
void printMessage(const char* msg) {
legacyPrint(const_cast<char*>(msg)); // نزيل const لمطابقة التوقيع فقط
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| إزالة const | الاستخدام الأشيع — لمطابقة دوال قديمة لا تقبل const |
| إزالة volatile | أقل شيوعًا — بسياقات منخفضة المستوى |
| لا يغيّر النوع الأساسي | فقط صفات const/volatile؛ لتغيير النوع نفسه استخدم static_cast |
💡 نصائح عملية
- استخدمه فقط لمطابقة واجهات (APIs) قديمة لا تقبل const — وليس كحل سريع لتفادي إعادة تصميم الكود
- تأكّد أن الكائن الأصلي وراء المؤشّر ليس const حقيقيًا قبل تعديل القيمة عبره
⚠️ أخطاء شائعة
- تعديل قيمة كائن أُنشئ const من البداية عبر const_cast — سلوك غير معرَّف رغم أن الكود يترجم بلا أخطاء
- الظن أنه يحوّل بين أنواع مختلفة — يغيّر فقط const/volatile، لا النوع الأساسي
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.