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

static

التخزين الساكن والأعضاء المشتركة static

static لها ثلاثة معانٍ حسب السياق: متغيّر محلي يحتفظ بقيمته بين الاستدعاءات، عضو صنف مشترك بين كل الكائنات، أو رمز مخفي عن ملفات أخرى.

داخل دالة، static local variable يُهيَّأ مرة واحدة فقط ويحتفظ بقيمته بين كل استدعاء واستدعاء — مفيد لعدّادات أو كاش بسيط. داخل صنف، static member ينتمي للصنف نفسه لا لكل كائن على حدة، فكل الكائنات تشارك نفس النسخة. وعلى مستوى الملف، static تحجب الرمز عن ملفات .cpp الأخرى (internal linkage).

الاستخدام الأشيع بالمشاريع الحقيقية هو static member للعدّادات المشتركة أو الثوابت المرتبطة بالصنف نفسه بدل كل كائن.

الصياغة

static Type name;              // داخل دالة أو صنف
class X { static int count; }; // إعلان، ويحتاج تعريف خارج الصنف

📄 مثال

class Counter {
    static int totalCreated; // مشترك بكل الكائنات
public:
    Counter() { totalCreated++; }
    static int getTotal() { return totalCreated; }
};
int Counter::totalCreated = 0; // التعريف

Counter a, b, c;
std::cout << Counter::getTotal(); // 3

أهم النقاط

العنصرالوظيفة
static (محلي)متغيّر داخل دالة يبقى محتفظًا بقيمته بين الاستدعاءات المتكررة
static (عضو صنف)قيمة واحدة مشتركة بين كل كائنات الصنف — يُنادى عبر اسم الصنف
static functionدالة عضو تُستدعى بدون كائن، ولا تصل لأعضاء غير static

💡 نصائح عملية

  • أعضاء static تحتاج تعريفًا منفصلًا خارج الصنف بملف .cpp (قبل C++17 وinline static)
  • استخدم static local variable بحذر بالبرامج متعددة الخيوط — تحتاج مزامنة يدوية أحيانًا

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

  • نسيان تعريف static member خارج الصنف يسبب خطأ ربط (linker error) غامضًا
  • الظن أن static member له نسخة منفصلة لكل كائن — بالعكس، هي نسخة واحدة للجميع

خصائص ذات صلة

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