التمرير بالقيمة مقابل التمرير بالمرجع
قارن الفروق الدلالية وفروق الأداء بين التمرير بالقيمة والتمرير بالمرجع.
التمرير بالقيمة مقابل التمرير بالمرجع درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
مراجعة التمرير حسب القيمة
عند تمرير وسيط حسب القيمة، تحصل الدالة على نسخة. ولا تؤثر التغييرات داخل الدالة في المستدعي.
void increment(int x) {
x++; // modifies the copy
}
int n = 5;
increment(n);
std::cout << n; // still 5التمرير بالمرجع
مرّر بالمرجع باستخدام & في قائمة المعاملات. تعمل الدالة مباشرةً على متغير المستدعي.
void increment(int& x) {
x++;
}
int n = 5;
increment(n);
std::cout << n; // now 6لماذا نمرّر بالمرجع؟
لسببين:
- تجنب نسخ الكائنات الكبيرة (من ناحية الأداء)
- تعديل متغير المستدعي (من ناحية الدلالة)
مرجع const: أفضل ما في الطريقتين
يتجنب مرجع const النسخ، دون أن يمنح الدالة صلاحية التعديل. استخدمه لمعلمات الإدخال غير البسيطة.
void printName(const std::string& name) {
std::cout << name;
}قواعد عامة
بالنسبة إلى معلمات الدوال:
- إذا كان النسخ رخيصًا (int وdouble والمؤشر) → مرّر حسب القيمة
- إذا كان النسخ مكلفًا وكانت القراءة فقط مطلوبة →
const T& - إذا كانت الدالة تعدّل بيانات المستدعي →
T&
التمرير بالمؤشر
تتيح المؤشرات أيضًا تعديل متغير المستدعي، لكن يجب على المستدعي أخذ العنوان صراحةً باستخدام &، مما يجعل القصد واضحًا.
void increment(int* x) {
(*x)++;
}
int n = 5;
increment(&n);معلمة المرجع مقارنة بمعلمة المؤشر
تكون المراجع أفضل عندما تكون القيمة مطلوبة دائمًا. وتكون المؤشرات مناسبة عندما يكون الوسيط اختياريًا، إذ يمكنك تمرير nullptr لتخطيه.
الإرجاع حسب القيمة
الإرجاع حسب القيمة هو السلوك الافتراضي. وبفضل RVO (تحسين قيمة الإرجاع) ودلالات النقل، يكون هذا عادةً سريعًا بقدر الإرجاع بالمرجع، وأكثر أمانًا.
الإرجاع بالمرجع
أرجِع مرجعًا عندما تُرجع الدالة كائنًا موجودًا يستمر عمره بعد استدعاء الدالة، كعضو في حاوية مثلًا. لا تُرجع مرجعًا إلى متغير محلي مطلقًا.
مزج أساليب التمرير في القوالب
تستخدم القوالب غالبًا المراجع العامة (T&&) وstd::forward للحفاظ على فئات القيم. سنتناول ذلك في دورة دلالات النقل.
خطأ شائع: الاقتطاع
مرّر الفئات المشتقة بالمرجع (أو بالمؤشر) إلى معلمة من الفئة الأساسية. إذ يؤدي التمرير حسب القيمة إلى اقتطاع الجزء المشتق من الكائن.
class Base { /* virtual */ };
class Derived : public Base { /* members */ };
void takeByValue(Base b); // SLICES Derived!
void takeByRef(Base& b); // OKاختبار سريع
كيف ينبغي تمرير std::string كبير لا تقرأ الدالة منه إلا البيانات؟
مراجعة
ينسخ التمرير حسب القيمة، بينما يشارك التمرير بالمرجع الكائن. استخدم const T& للكائنات الكبيرة للقراءة فقط، وT& عند تعديل بيانات المستدعي، والقيم المضمنة الصغيرة حسب القيمة.
الأسئلة الشائعة
هل درس «التمرير بالقيمة مقابل التمرير بالمرجع» مجاني؟
نعم — نص درس «التمرير بالقيمة مقابل التمرير بالمرجع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «التمرير بالقيمة مقابل التمرير بالمرجع»؟
قارن الفروق الدلالية وفروق الأداء بين التمرير بالقيمة والتمرير بالمرجع. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التمرير بالقيمة مقابل التمرير بالمرجع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا تُعدّ المراجع أسماءً مستعارة للمتغيرات
- التمرير بالقيمة مقابل التمرير بالمرجع
- مراجع const ومتى تُستخدم
- عمر المرجع والمراجع المتدلية