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