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

enum class

التعدادات المحكومة enum class

enum class تعريف حديث للتعدادات (C++11) يمنع تسريب أسمائها للنطاق المحيط ويمنع تحويلها الضمني لعدد صحيح — أأمن من enum التقليدية.

التعداد التقليدي (enum) الموروث من C يسرّب أسماء قيمه للنطاق المحيط مباشرة (فقد تتعارض مع اسم آخر) ويسمح بتحويلها الضمني لعدد صحيح دون تنبيه، ما يسبب أخطاء منطقية صامتة. enum class يحل الاثنين: يجب الوصول للقيمة عبر Name::Value، ولا يوجد تحويل ضمني لعدد صحيح إلا بتحويل صريح static_cast.

الصياغة

enum class Name {
    Value1,
    Value2
};
Name v = Name::Value1;

📄 مثال

enum class Status {
    Pending,
    Active,
    Closed
};

Status s = Status::Active;

if (s == Status::Active) {
    std::cout << "الحساب فعّال";
}
// int x = s; // خطأ ترجمة — يمنع enum class التحويل الضمني

أهم النقاط

العنصرالوظيفة
enum class Name { }تعداد محكوم النطاق، القيم تُنادى عبر Name::Value
enum Name { } (تقليدية)الصيغة القديمة الموروثة من C — تسرّب الأسماء وتسمح بتحويل ضمني
static_cast<int>(v)التحويل الصريح الوحيد المسموح من enum class لعدد صحيح

💡 نصائح عملية

  • استخدم enum class دائمًا بكود جديد بدل enum التقليدية — أمان أكبر بلا أي تكلفة أداء إضافية
  • يمكن تحديد النوع الأساسي صراحة: enum class Status : uint8_t { ... } لتوفير الذاكرة

⚠️ أخطاء شائعة

  • توقّع مقارنة enum class مباشرة مع عدد صحيح بدون تحويل صريح — يفشل البناء وهذا مقصود للأمان
  • استخدام enum التقليدية بمشروع كبير فتتصادم أسماء القيم بين تعدادات مختلفة بنفس النطاق

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.