Menu
Coddy logo textTech

העברה לפי הפניה

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 41 מתוך 56.

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

כדי להעביר באמצעות הפניה, הוסף את הסמל & אחרי סוג הפרמטר בהצהרת הפונקציה:

void doubleValue(int& number) {
    number = number * 2;  // משנה את המשתנה המקורי
}

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

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

challenge icon

אתגר

קל

צרו פונקציה שמדגימה העברה באמצעות הפניה על ידי שינוי ישיר של משתנים דרך פרמטרים של פונקציה. האתגר הזה יבדוק את ההבנה שלכם לגבי האופן שבו הסימן & מאפשר לפונקציות לעבוד עם המשתנים המקוריים במקום עם עותקים.

הקלטים הבאים יסופקו:

  • מספר שלם value1 שמייצג את המספר הראשון
  • מספר שלם value2 שמייצג את המספר השני
  • מספר שלם value3 שמייצג את המספר השלישי

על התוכנית שלכם לבצע את הפעולות הבאות:

  1. ליצור פונקציה בשם tripleValues שמקבלת שלושה פרמטרים של מספרים שלמים באמצעות הפניה
  2. בתוך הפונקציה, להכפיל כל פרמטר ב-3
  3. בפונקציה הראשית, לקרוא את שלושת ערכי הקלט ולשמור אותם במשתנים
  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). כך הפונקציה יכולה לשנות ישירות את המשתנים המקוריים שהועברו אליה, ולהדגים את ההבדל המרכזי בין העברה לפי ערך להעברה באמצעות הפניה. המשתנים ב-main ישתנו לצמיתות לאחר הקריאה לפונקציה, וכך יוכח שהפונקציה עבדה עם מיקומי הזיכרון המקוריים ולא עם עותקים.

נסו בעצמכם

#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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C++ אונליין