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

nullptr

ثابت المؤشّر الفارغ nullptr

nullptr كلمة مفتاحية أضافها C++11 لتمثيل مؤشّر فارغ بنوع محدّد (std::nullptr_t)، بديل أوضح وأأمن من NULL أو 0 القديمين.

قبل C++11 كان المطوّرون يستخدمون الماكرو NULL (يساوي فعليًا 0) أو الرقم 0 مباشرة لتمثيل مؤشّر فارغ — لكن كلاهما من النوع int، ما يسبّب التباسًا حقيقيًا بحالات التحميل الزائد (overload resolution) بين نسخة تأخذ مؤشّرًا ونسخة تأخذ عددًا صحيحًا. nullptr له نوعه الخاص std::nullptr_t القابل للتحويل الضمني لأي نوع مؤشّر، فيزيل هذا الالتباس تمامًا.

الصياغة

Type* p = nullptr;
std::nullptr_t np = nullptr; // النوع الفعلي، نادر الاستخدام مباشرة

📄 مثال

#include <utility>

void func(std::pair<const char*, double>);

func(std::make_pair(NULL, 3.14));     // ❌ خطأ ترجمة — NULL يصبح int هنا
func(std::make_pair(nullptr, 3.14));  // ✅ nullptr_t يتحوّل لـ const char* بأمان

int* p = nullptr;
if (p == nullptr) {
    // فحص واضح ولا لبس فيه
}

أهم النقاط

العنصرالوظيفة
std::nullptr_tنوعه الفعلي — قابل للتحويل الضمني لأي مؤشّر، وليس لأي نوع عددي
يتطلّب <cstddef>فقط لو استخدمت اسم النوع std::nullptr_t صراحة؛ الكلمة nullptr نفسها بلا include

💡 نصائح عملية

  • استخدم nullptr دائمًا بدل NULL أو 0 بكود C++ حديث — لا سبب للتراجع عنه إطلاقًا
  • مفيد خصوصًا بحالات التحميل الزائد (overloads) حيث NULL/0 قد يستدعي النسخة الرقمية بالخطأ

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

  • الاستمرار باستخدام NULL بكود جديد — لا يزال يترجم لكنه يفقد أمان النوع الذي يوفّره nullptr
  • افتراض أن nullptr من نوع int — نوعه الحقيقي std::nullptr_t، مختلف تمامًا

خصائص ذات صلة

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