الدرس 5 من 10

القيمة والمرجع

هدف الدرس

int& و const std::string&

01

الشرح

تمرّر C++ إلى الدالة نسخة من كل وسيط افتراضيًّا: void heal(int hp) { hp += 10; } تزيد نسختها هي، ويبقى متغيّر المستدعي كما كان. وهذا آمن، لكنه ليس ما تريده حين تكون مهمّة الدالة أن تغيّر.

و& بعد النوع تجعل الوسيط مرجعًا: اسمًا آخر لمتغيّر المستدعي نفسه لا نسخة منه. void heal(int& hp) { hp += 10; } تغيّر المتغيّر الذي مُرِّر إليها، والاستدعاء لا يتغيّر: heal(playerHp);، فالفرق كلّه في التوقيع. والمرجع يحتاج متغيّرًا يشير إليه، فـ heal(50) لا تُترجَم: لا متغيّر هناك يتغيّر.

ونسخ عدد رخيص، أما نسخ نصّ طويل أو قائمة كبيرة فلا. const std::string& name تمرّر الأصل بلا نسخ، وconst تَعِد ألّا تمسّه الدالة، ويرفض المترجم أي محاولة لتعديله. وهذا هو المعتاد لقراءة النصوص والكائنات الكبيرة، وتراه في Unreal في كل مكان: const FString&.

02

المطلوب

الدوال الثلاث مكتوبة لكنها لا تعمل: كلٌّ منها تعدّل نسخة. شغّل البرنامج وانظر، ثم أصلح تواقيعها. swapValues(a, b) تبادل قيمتي المتغيّرين نفسيهما. وaddBonus(score, bonus) تزيد النقاط نفسها، وتتجاهل المكافأة السالبة. وaddTag(name, tag) تضع الوسم قبل الاسم نفسه بالشكل [VIP] ليان، وتقرأ tag مرجعًا ثابتًا const std::string&.

معايير التصحيح

5 معايير
  1. swapValues تبادل المتغيّرين أنفسهما
  2. addBonus تزيد النقاط نفسها
  3. addBonus تتجاهل المكافأة السالبة
  4. addTag تضع الوسم قبل الاسم نفسه
  5. addTag تقرأ tag بـ const std::string& بلا نسخ
main.cpp
المخرجاتC++17 · GCC 9 · Judge0

يُترجَم الكود ويعمل على السيرفر…

–/5

يُترجَم الكود ويعمل على السيرفر…

5 معايير في بطاقة «المطلوب».