העברה לפי הפניה
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 41 מתוך 56.
כשמעבירים ארגומנטים לפונקציות, C++ בדרך כלל יוצר עותקים של הערכים. המשמעות היא ששינויים בתוך הפונקציה אינם משפיעים על המשתנים המקוריים. העברה באמצעות הפניה משנה את ההתנהגות הזו בכך שהיא מאפשרת לפונקציות לעבוד ישירות עם המשתנים המקוריים.
כדי להעביר באמצעות הפניה, הוסף את הסמל & אחרי סוג הפרמטר בהצהרת הפונקציה:
void doubleValue(int& number) {
number = number * 2; // משנה את המשתנה המקורי
}כשקוראים לפונקציה הזאת, כל שינוי שנעשה לפרמטר בתוך הפונקציה ישנה ישירות את המשתנה המקורי שהועבר אליה. זה שימושי במיוחד כשרוצים שפונקציה תשנה את הארגומנטים שלה, או כשעובדים עם אובייקטים גדולים שהעתקתם תהיה לא יעילה.
העברה באמצעות הפניה מבטלת את התקורה של העתקת נתונים, וכך התוכניות שלך נעשות מהירות יותר ויעילות יותר בזיכרון, במיוחד כשעובדים עם מבני נתונים מורכבים כמו וקטורים או מפות.
אתגר
קלצרו פונקציה שמדגימה העברה באמצעות הפניה על ידי שינוי ישיר של משתנים דרך פרמטרים של פונקציה. האתגר הזה יבדוק את ההבנה שלכם לגבי האופן שבו הסימן & מאפשר לפונקציות לעבוד עם המשתנים המקוריים במקום עם עותקים.
הקלטים הבאים יסופקו:
- מספר שלם
value1שמייצג את המספר הראשון - מספר שלם
value2שמייצג את המספר השני - מספר שלם
value3שמייצג את המספר השלישי
על התוכנית שלכם לבצע את הפעולות הבאות:
- ליצור פונקציה בשם
tripleValuesשמקבלת שלושה פרמטרים של מספרים שלמים באמצעות הפניה - בתוך הפונקציה, להכפיל כל פרמטר ב-3
- בפונקציה הראשית, לקרוא את שלושת ערכי הקלט ולשמור אותם במשתנים
- להדפיס את הערכים המקוריים לפני קריאה לפונקציה
- לקרוא לפונקציה
tripleValuesעם שלושת המשתנים - להדפיס את הערכים ששונו לאחר הקריאה לפונקציה כדי להראות שהם השתנו
השתמשו בפורמט הפלט המדויק הבא:
לפני הקריאה לפונקציה:
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;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים4מפות (זוגות מפתח-ערך)
היכרות עם std::mapיצירת מפהגישה לערכים ושינויםבדיקה אם מפתחות קיימיםהסרת זוגותמעבר על מפהסיכום – שכיחות מילים7פונקציות מתקדמות
העברה לפי הפניהמבוא לביטויי LambdaLambda עם פרמטריםLambda עם ערכי החזרהמבוא לרקורסיהעצרת רקורסיביתמיון באמצעות Lambda2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין