שיעורי מודול (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;
}העברת עזר (&)
אם אתה רוצה שהפונקציה תוכל לשנות את המשתנה המקורי, או אם אתה רוצה להימנע מהעתקת אובייקטים גדולים (כמו מחרוזות ארוכות או וקטורים), עליך להשתמש ב-pass by reference.
הפניה מוצהרת על ידי הוספת הסמל & אחרי סוג הפרמטר:
#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 ניסיונות
הגדר פונקציה בשם swap שלוקחת שני הפניות של מספרים שלמים a ו-b (int& a, int& b) ומחליפה את הערכים שלהם באמצעות משתנה זמני temp. קרא אותו ב-main כדי להחליף את x ו-y, ולאחר מכן להדפיס אותם.
הצג רמז
השתמש ב- `int temp = a; a = b; b = temp;` כדי להחליף את הערכים.
הפתרון זמין לאחר 3 ניסיונות