דילוג לתוכן המרכזי
מודול 3 · שיעור 2 מתוך 28/18 בקורס~12 min
שיעורי מודול (2/2)

עוברים לפי ערך והתייחסות

ב-C++, כאשר אתה מעביר ארגומנט לפונקציה, ישנן שתי דרכים עיקריות לעשות זאת: לפי ערך או על ידי הפניה.

הבנת ההבחנה הזו היא המפתח הן לתקינות התוכנית והן לאופטימיזציה של ביצועים.

מעבר ערך (העתק)

כברירת מחדל, 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.

הפניה מוצהרת על ידי הוספת הסמל & אחרי סוג הפרמטר:

C++
#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 שהועבר בעת קריאה לפונקציה.

נסה זאת בעצמך

פעילות גופנית#cpp.m3.l2.e1
ניסיונות: 0טוען...

הגדר פונקציה בשם doubleNumber עם סוג החזרה ריק שלוקח הפניה למספר n שלם (באמצעות int&n) ומכפיל את ערכו (n = n * 2). קרא לזה במעבר ראשי את המשתנה val מאותחל ל-10, ואז הדפס val.

טוען עורך...
הצג רמז

חתימת הפונקציה משתמשת בתו `&` אחרי הטיפוס כדי לציין הפניה:`void doubleNumber(int&n)`.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#cpp.m3.l2.e2
ניסיונות: 0טוען...

הגדר פונקציה בשם swap שלוקחת שני הפניות של מספרים שלמים a ו-b (int& a, int& b) ומחליפה את הערכים שלהם באמצעות משתנה זמני temp. קרא אותו ב-main כדי להחליף את x ו-y, ולאחר מכן להדפיס אותם.

טוען עורך...
הצג רמז

השתמש ב- `int temp = a; a = b; b = temp;` כדי להחליף את הערכים.

הפתרון זמין לאחר 3 ניסיונות