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

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