C++/מצביעים והמשתנה הפניה: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Daniz28 (שיחה | תרומות)
Daniz28 (שיחה | תרומות)
שורה 25:
</syntaxhighlight>
 
==מהו משתנה מיוחסהפניה?==
המשתנה המיוחסהפניה פועל בדומה למצביע ובא במקרים מסוימים להחליף אותו.<br /> למשתנה המיוחסהפניה כמה יתרונות וחסרונות לעומת המצביע. גם בעזרתו ניתן להשפיע בעקיפין על משתנה אחר, אלא שהוא חוסך את הכתיבה המסורבלת של אופרטורים נוספים. אפשר להבין אותו גם כשם חדש למשתנה שכבר הוכרז בזיכרון.
גם כאן, כמו במצביע, השימוש העיקרי הוא בהעברתו כארגומנט לפונקציה, במקרה שאנו רוצים שהוא יושפע ממנה.
==יישום בדוגמה פשוטה==
הבה נגדיר משתנה מיוחסהפניה:
<source lang="c++">
int num;
int &ref = num;
</source>
למשתנה המיוחסהפניה קראנו ref, הכרזנו אותו כמתייחסכמפנה לטיפוס int, והקדמנו לשמו את התו &.
בדומה למקרה של הכרזת מצביע, שם נקדים את התו *.<br />
ייחסנוהפננו את המשתנה ref למשתנה num.
שימו לב: לא התרחשה כאן השמת ערכים, אלא ייחוסהפניה של המשתנה ref למשתנה num, כזהכזו ייחוסהפניה אגב, יכוליכולה להתרחש רק פעם אחת בחייו של משתנה מיוחסהפניה, וחייב להתבצע בהכרזה שלו.
עכשיו אם נשנה את ערכו של ref, ישתנה גם ערכו של num, וכך גם ההפך:
<source lang="c++">
ref = 10;
cout << num; //10
num = 20;
cout << ref; //20
</source>
ניתן לראות שלקביעת ייחוסהפניה יש דמיון לנתינת שם חדש, נרדף, למשתנה. את אותו הדבר יהיה אפשר כמובן ליישם בעזרת מצביעים, אבל אם כך, היינו זקוקים לשימוש רב באופרטורים.
 
==שימוש בפונקציות==
כמו שאמרנו קודם, השימוש העיקרי של משתניםמשתני מתייחסיםהפניה, כמו של מצביעים, הוא בפונקציות.
לדוגמה, נכתוב פונקציה שמחליפה בין ערכיהם של שני משתנים בשם ()swap:
<source lang="c++">
#include<iostream.h>
 
void swap(int &a, int &b);
 
int main() {
int num1 = 5, num2 = 10;
{
int swap(num1=5, num2=10);
swap( cout << num1, << endl << num2);
return 0;
cout << num1 << endl << num2;
return 0;
}
 
void swap(int &a,int &b) {
b= int temp;
{
int temp = a;
a = b;
temp=a;
b = temp;
a=b;
b=temp;
}
</source>
שימו לב שהפרמטרים המועברים לפונקציה, הם ללא שום אופרטור מצביע.<br /> ובכל זאת הפונקציה משפיעה על המשתנים num1 וnum2ו-num2 שנמצאים בתוכנית.<br /> בתוך הפונקציה, הגישה לפרמטרים a ו -b היא שגרתית כאילו הם משתנים רגילים, לאחר שכל אחד מהם כבר מתייחסמופנה למשתנה שנשלח לו בארגומנט, בהתאמה.<br />הפונקציה כמובן אינה מחזירה כלום ולכן מוגדרת כvoidכ-void. <br />
==משתניםמשתני מתייחסיםהפניה כערכים מוחזרים==
 
ניתן לייצור משתנה מיוחסהפניה, שיוחזר מפונקציה (כאן num הוא משתנה גלובלי כלשהו):
==משתנים מתייחסים כערכים מוחזרים==
ניתן לייצור משתנה מיוחס, שיוחזר מפונקציה (כאן num הוא משתנה גלובלי כלשהו):
<source lang="c++">
int &getnum() {
int &ref = num;
{
int & return ref=num;
return ref;
}
</source>
הטיפוס המוחזר של הפונקציה ()getnum הוא משתנה מיוחסערך של int בהפניה.
אפשר להשתמש בפונקציה בכדי לקבל את ערכו של num כך:
<source lang="c++">
cout << getnum();
</source>
פעולה כזאת אפשרית גם ללא משתניםמשתני מתייחסיםהפניה, ולכן דרך יותר מעניינת היא, להציב ערך לnum דרך הפונקציה:
<source lang="c++">
getnum() = 50;
</source>
עכשיו ערכו של num הוא 50.