دروس الوحدة (2/2)
تمر حسب القيمة والمرجع
في لغة C++، عندما تقوم بتمرير وسيطة إلى دالة، هناك طريقتان رئيسيتان للقيام بذلك: حسب القيمة أو حسب المرجع.
يعد فهم هذا التمييز أمرًا أساسيًا لكل من صحة البرنامج وتحسين الأداء.
تمرير حسب القيمة (نسخة)
بشكل افتراضي، يقوم C++ بتمرير الوسائط حسب القيمة. وهذا يعني أنه يتم إنشاء نسخة من البيانات في الذاكرة. أي تعديل يتم إجراؤه داخل الدالة لن يؤثر على المتغير الأصلي خارجها:
#include <iostream>
void increment(int n) {
n++; // Modifies only the local copy
}
int main() {
int x = 5;
increment(x);
std::cout << x << std::endl; // Prints 5, x remains unchanged!
return 0;
}المرور حسب المرجع (&)
إذا كنت تريد أن تكون الدالة قادرة على تعديل المتغير الأصلي، أو إذا كنت تريد تجنب نسخ كائنات كبيرة (مثل السلاسل الطويلة أو المتجهات)، فيجب عليك استخدام تمرير حسب المرجع.
يتم الإعلان عن المرجع بإضافة الرمز & بعد نوع المعلمة:
#include <iostream>
void incrementRef(int& n) {
n++; // Modifies the original variable directly
}
int main() {
int x = 5;
incrementRef(x);
std::cout << x << std::endl; // Prints 6!
return 0;
}المعلمة int& n ليست نسخة، ولكنها اسم مستعار (مرجع مباشر) للمتغير x الذي تم تمريره عند استدعاء الدالة.
جربه بنفسك
حدد دالة باسم doubleNumber بنوع إرجاع فارغ يأخذ مرجعًا إلى عدد صحيح n (باستخدام int& n) ويضاعف قيمته (n = n * 2). نسميها بشكل رئيسي بتمرير المتغير val الذي تمت تهيئته إلى 10، ثم طباعة val.
إظهار التلميح
يستخدم توقيع الوظيفة الحرف &` بعد النوع للإشارة إلى مرجع:`void doubleNumber(int& n)`.
الحل متاح بعد 3 من المحاولات
حدد دالة تسمى المبادلة والتي تأخذ مرجعين صحيحين a وb (int& a, int& b) وتتبادل قيمهما باستخدام متغير مؤقت مؤقت. استدعيها بشكل رئيسي لمبادلة x و y، ثم قم بطباعتهما.
إظهار التلميح
استخدم `int temp = a; أ = ب؛ b = temp;` لتبديل القيم.
الحل متاح بعد 3 من المحاولات