Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التمرير بالمرجع

جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 41 من 56.

عندما تقوم بتمرير الوسائط إلى الدوال، تقوم لغة C++ عادةً بإنشاء نسخ من القيم. وهذا يعني أن التغييرات داخل الدالة لا تؤثر على المتغيرات الأصلية. ويقوم التمرير بالمرجع (Pass by reference) بتغيير هذا السلوك من خلال السماح للدوال بالعمل مباشرة مع المتغيرات الأصلية.

للتمرير بالمرجع، أضف الرمز & بعد نوع المعلمة في إعلان الدالة الخاص بك:

void doubleValue(int& number) {
    number = number * 2;  // يقوم بتعديل المتغير الأصلي
}

عندما تستدعي هذه الدالة، فإن أي تغييرات يتم إجراؤها على المعامل (parameter) داخل الدالة ستؤدي إلى تعديل المتغير الأصلي الذي تم تمريره مباشرةً. هذا مفيد بشكل خاص عندما تريد أن تقوم الدالة بتعديل وسائطها (arguments) أو عند العمل مع كائنات كبيرة حيث يكون النسخ غير فعال.

يؤدي التمرير بالمرجع (Pass by reference) إلى إزالة العبء الإضافي الناتج عن نسخ البيانات، مما يجعل برامجك أسرع وأكثر كفاءة في استهلاك الذاكرة، خاصة عند التعامل مع هياكل بيانات معقدة مثل vectors أو maps.

challenge icon

التحدي

سهل

قم بإنشاء دالة توضح التمرير بالمرجع (pass by reference) عن طريق تعديل المتغيرات مباشرة من خلال معاملات الدالة. سيختبر هذا التحدي فهمك لكيفية سماح رمز & للدوال بالعمل مع المتغيرات الأصلية بدلاً من النسخ.

سيتم توفير المدخلات التالية:

  • عدد صحيح value1 يمثل الرقم الأول
  • عدد صحيح value2 يمثل الرقم الثاني
  • عدد صحيح value3 يمثل الرقم الثالث

يجب أن يقوم برنامجك بما يلي:

  1. إنشاء دالة باسم tripleValues تأخذ ثلاثة معاملات صحيحة بالمرجع
  2. داخل الدالة، اضرب كل معامل في 3
  3. في الدالة الرئيسية (main)، اقرأ قيم المدخلات الثلاثة وقم بتخزينها في متغيرات
  4. اطبع القيم الأصلية قبل استدعاء الدالة
  5. استدعِ الدالة tripleValues مع المتغيرات الثلاثة
  6. اطبع القيم المعدلة بعد استدعاء الدالة لإظهار أنه تم تغييرها

استخدم تنسيق المخرجات الدقيق التالي:

قبل استدعاء الدالة:

Original values: [value1] [value2] [value3]

بعد استدعاء الدالة:

Tripled values: [new_value1] [new_value2] [new_value3]

يجب أن يستخدم توقيع الدالة رمز & بعد كل نوع معامل للإشارة إلى التمرير بالمرجع: void tripleValues(int& a, int& b, int& c). يتيح ذلك للدالة تعديل المتغيرات الأصلية التي تم تمريرها إليها مباشرة، مما يوضح الفرق الجوهري بين التمرير بالقيمة والتمرير بالمرجع. ستتغير المتغيرات في الدالة الرئيسية بشكل دائم بعد استدعاء الدالة، مما يثبت أن الدالة عملت مع مواقع الذاكرة الأصلية بدلاً من النسخ.

ورقة مرجعية

للتمرير بالمرجع (pass by reference) في لغة C++، أضف الرمز & بعد نوع المعامل في إعلان الدالة الخاص بك:

void doubleValue(int& number) {
    number = number * 2;  // يقوم بتعديل المتغير الأصلي
}

يسمح التمرير بالمرجع للدوال بالعمل مباشرة مع المتغيرات الأصلية بدلاً من النسخ. التعديلات التي يتم إجراؤها على المعاملات داخل الدالة ستؤدي إلى تعديل المتغيرات الأصلية التي تم تمريرها.

يؤدي هذا إلى التخلص من عبء نسخ البيانات، مما يجعل البرامج أسرع وأكثر كفاءة في استخدام الذاكرة، خاصة مع هياكل البيانات المعقدة مثل vectors أو maps.

جرّب بنفسك

#include <iostream>
using namespace std;

// TODO: أنشئ دالة tripleValues هنا

int main() {
    // قراءة قيم المدخلات
    int value1, value2, value3;
    cin >> value1 >> value2 >> value3;
    
    // طباعة القيم الأصلية
    cout << "Original values: " << value1 << " " << value2 << " " << value3 << endl;
    
    // TODO: استدعِ دالة tripleValues هنا
    
    // طباعة القيم المعدلة
    cout << "Tripled values: " << value1 << " " << value2 << " " << value3 << endl;
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow