0Pricing
C++ Academy · درس

مراجع const ومتى تُستخدم

مرّر الكائنات الكبيرة بكفاءة وأمان باستخدام مراجع const.

مراجع const ومتى تُستخدم درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ما الذي يضمنه مرجع const

يقول const T&: «لن أعدّل ما أشير إليه». ويفرض المترجم ذلك.

void print(const std::string& s) {
    // s.clear();   // ERROR: s is const
    std::cout << s;
}

لماذا لا نمرّر حسب القيمة فحسب؟

يُعد نسخ الكائنات الكبيرة إهدارًا للموارد. ومرجع const لا يكلّف شيئًا تقريبًا، فهو مجرد مؤشر داخليًا، ولا يسمح للدالة مطلقًا بتعديل بيانات المستدعي.

الربط بأي شيء

يمكن لمرجع const أن يرتبط بقيم lvalue وrvalue وبالكائنات المؤقتة، مما يجعله نوع المعلمة الأكثر مرونة للوصول للقراءة فقط.

void f(const std::string& s);
std::string a = "hi";
f(a);                 // lvalue
f("hello");           // temporary string
f(std::move(a));      // rvalue

تمديد العمر

يؤدي ربط كائن مؤقت بمرجع const إلى تمديد عمر الكائن المؤقت ليطابق عمر المرجع. وهذا مفيد عند الإنشاء ضمن السطر.

const std::string& greeting = "Hello, " + name;
// the concatenated string lives as long as `greeting`

متى لا تستخدم مرجع const

بالنسبة إلى الأنواع التي يمكن نسخها بسهولة (int وdouble والمؤشر)، مرّر حسب القيمة. إذ يضيف المرجع مستوى من عدم المباشرة دون أي فائدة.

مرجع const في حلقة for المعتمدة على النطاق

هذه هي الحلقة القياسية للقراءة فقط. فهي تتجنب النسخ والتعديل غير المقصود معًا.

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

إرجاع مرجع const

أرجِع مرجع const عندما تكون النتيجة كائنًا موجودًا لا ينبغي للمستدعي تعديله، مثل عضو أو قيمة مخزنة مؤقتًا.

class Person {
    std::string name_;
public:
    const std::string& name() const { return name_; }
};

الصحة بالنسبة إلى const

ضع وسم const على كل معلمة ودالة عضو لا تعدّل الحالة. وسيلتقط المترجم عمليات الكتابة غير المقصودة، مما يوفر شبكة أمان قوية.

دوال الأعضاء من نوع const

لا يمكن لدالة عضو تحمل وسم const بعد قائمة المعلمات أن تعدّل الكائن. وتُستدعى على النسخ من نوع const.

class Counter {
    int n_ = 0;
public:
    int value() const { return n_; }   // pure reader
    void increment() { n_++; }
};

مطب: إزالة const باستخدام const_cast

يمكنك إزالة const باستخدام const_cast، لكن القيام بذلك على كائن كان من نوع const أصلًا يؤدي إلى سلوك غير معرّف. استخدمه فقط عند التعامل مع واجهات برمجية قديمة غير من نوع const.

استخدام mutable للحالة الداخلية

تتيح الكلمة المفتاحية mutable لدالة عضو من نوع const تعديل أعضاء محددين، وهذا مفيد للتخزين المؤقت أو كائنات كتم الصوت.

class Cache {
    mutable std::mutex mtx_;
    mutable std::optional<int> cached_;
public:
    int value() const {
        std::lock_guard<std::mutex> lk(mtx_);
        // ...
    }
};

اختبار سريع

لماذا يكون من الأفضل عادةً كتابة const std::string& بدلًا من std::string لمعلمة؟

مراجعة

استخدم const T& للمعلمات التي تُقرأ فقط، وقيم الإرجاع من دوال الحصول، وحلقات for المعتمدة على النطاق. فهو أسرع من التمرير حسب القيمة للأنواع غير البسيطة، وأكثر أمانًا من المراجع غير الثابتة.

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

هل درس «مراجع const ومتى تُستخدم» مجاني؟

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

ماذا ستتعلم في «مراجع const ومتى تُستخدم»؟

مرّر الكائنات الكبيرة بكفاءة وأمان باستخدام مراجع const. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «مراجع const ومتى تُستخدم»؟

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

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

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

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

  1. لماذا تُعدّ المراجع أسماءً مستعارة للمتغيرات
  2. التمرير بالقيمة مقابل التمرير بالمرجع
  3. مراجع const ومتى تُستخدم
  4. عمر المرجع والمراجع المتدلية
← العودة إلى C++ Academy