0Pricing
C++ Academy · درس

‏range-based for وnullptr وenum class

استخدم تسهيلات C++11: ‏range-based for وnullptr والتعدادات محددة النوع.

‏range-based for وnullptr وenum class درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ثلاثة مكاسب سريعة في C++11

قدّم C++11 العديد من التحسينات الصغيرة. وهناك ثلاثة ستستخدمونها يوميًا: range-based for وnullptr وenum class.

مراجعة range-based for

كرّروا على أي حاوية تحتوي على begin() وend() من دون حسابات الفهارس.

for (const auto& x : v) {
    process(x);
}

ما الذي يستبدله؟

تصبح الحلقة المطوّلة المعتمدة على المكررات سطرًا واحدًا.

// Before C++11
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    process(*it);
}

يتفوق nullptr على NULL

‏nullptr قيمة حرفية لمؤشر صفري ذات نوع محدد. وهي تتجنب الغموض في حلّ التحميلات الزائدة الذي يسببه NULL، وهو ماكرو للقيمة 0.

void f(int);
void f(int*);

f(NULL);      // calls f(int)
f(nullptr);   // calls f(int*)

لماذا يفوز nullptr؟

استخدموا nullptr باستمرار:

  • نوع مميّز (std::nullptr_t)
  • نية أوضح
  • يعمل في البرمجة الوصفية للقوالب
  • لا يمكن تحويله بالخطأ إلى int

enum عادية: مصدر للمشكلات

تسرّب التعدادات القديمة أسماءها إلى النطاق المحيط، وتتحول ضمنيًا إلى int.

enum Color { RED, GREEN, BLUE };
int c = RED;            // implicit conversion, no warning
// RED, GREEN, BLUE leak into global scope

enum class: محددة النطاق وذات نوع

تتطلب enum class في C++11 استخدام التأهيل، وتمنع التحويل الضمني إلى int.

enum class Color { Red, Green, Blue };
Color c = Color::Red;
// int n = Color::Red;     // ERROR
std::cout << static_cast<int>(c);   // explicit conversion

تحديد النوع الأساسي

يمكنكم تثبيت حجم تخزين enum class على نوع صحيح محدد.

enum class Status : uint8_t { OK = 0, FAIL = 1, RETRY = 2 };

التصريح المسبق عن enum class

بما أن النوع الأساسي معروف، يمكن التصريح مسبقًا عن enum class، وهذا مفيد لتقليل تضمينات ملفات الترويسة.

// header A
enum class Color : int;

// header B (full definition)
enum class Color : int { Red, Green, Blue };

متى تكون enum العادية مناسبة؟

لا تزال للتعدادات العادية استخدامات، مثل أقنعة بتات الرايات الصحيحة عندما تريدون التحويل الضمني فعلًا. وثّقوا خيار التصميم هذا بوضوح.

نصيحة للترحيل

عند تحديث قاعدة برمجية، حوّلوا التعدادات العادية إلى enum class تدريجيًا. ابحثوا عن المواضع التي تعتمد على التحويل الضمني إلى int، وأضيفوا static_cast.

تحقق سريع

ما الذي يجعل enum class أكثر أمانًا من enum عادية؟

مراجعة

ثلاثة مكاسب سريعة في C++11: تقلل حلقة for المعتمدة على النطاق التعليمات البرمجية الخاصة بالمكررات، ويستبدل nullptr‏ NULL، وتوفر enum class تعدادًا محدد النطاق وآمنًا من حيث النوع. استخدموا الميزات الثلاث افتراضيًا.

الأسئلة الشائعة

هل درس «‏range-based for وnullptr وenum class» مجاني؟

نعم — نص درس «‏range-based for وnullptr وenum class» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏range-based for وnullptr وenum class»؟

استخدم تسهيلات C++11: ‏range-based for وnullptr والتعدادات محددة النوع. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «‏range-based for وnullptr وenum class»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏auto وdecltype واستنتاج النوع
  2. ‏range-based for وnullptr وenum class
  3. تعبيرات Lambda: الالتقاط والقابلية للتعديل والعُمومية
  4. الربط المنظّم وتهيئة if في C++17
← العودة إلى C++ Academy