C++/מצביעים והמשתנה המיוחס

מתוך ויקיספר, אוסף ספרי הלימוד והמדריכים החופשי.

< C++
קפיצה אל: ניווט, חיפוש


תוכן עניינים

[עריכה] מהו משתנה מיוחס?

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

[עריכה] יישום בדוגמה פשוטה

הבה נגדיר משתנה מיוחס:

int &ref;

למשתנה המיוחס קראנו ref, הכרזנו אותו כמתייחס לטיפוס int, והקדמנו לשמו את התו &. בדומה למקרה של הכרזת מצביע, שם נקדים את התו *.
כעת נייחס את המשתנה המתייחס למשתנה רגיל אחר:

int num;
ref=num;

שימו לב: לא התרחשה כאן השמת ערכים, אלא ייחוס של המשתנה ref למשתנה num, כזה ייחוס אגב, יכול להתרחש רק פעם אחת בחייו של משתנה מיוחס. עכשיו אם נשנה את ערכו של ref, ישתנה גם ערכו של num, וכך גם ההפך:

ref=10;
cout << num;
num=20;
cout << ref;

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

[עריכה] שימוש בפונקציות

כמו שאמרנו קודם, השימוש העיקרי של משתנים מתייחסים, כמו של מצביעים, הוא בפונקציות. לדוגמה, נכתוב פונקציה שמחליפה בין ערכיהם של שני משתנים בשם ()swap:

#include<iostream.h>

void swap(int &a,int &b);

int main()
{
int num1=5,num2=10;
swap(num1,num2);
cout << num1 << endl << num2;
return 0;
}

void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}

שימו לב שהפרמטרים המועברים לפונקציה, הם ללא שום אופרטור מצביע.
ובכל זאת הפונקציה משפיעה על המשתנים num1 וnum2 שנמאים בתוכנית.
בתוך הפונקציה, הגישה לפרמטרים a ו b היא שגרתית כאילו הם משתנים רגילים, לאחר שכל אחד מהם כבר מתייחס למשתנה שנשלח לו, בהתאמה.
הפונקציה כמובן אינה מחזירה כלום ולכן מוגדרת כvoid.

[עריכה] משתנים מתייחסים כערכים מוחזרים

ניתן לייצור משתנה מיוחס, שיוחזר מפונקציה (כאן num הוא משתנה גלובלי כלשהו):

int &getnum()
{
int &ref=num;
return ref;
}

הטיפוס המוחזר של הפונקציה ()getnum הוא משתנה מיוחס של int. אפשר להשתמש בפונקציה בכדי לקבל את ערכו של num כך:

cout << getnum();

פעולה כזאת אפשרית גם ללא משתנים מתייחסים, ולכן דרך יותר מעניינת היא, להציב ערך לnum דרך הפונקציה:

getnum()=50;

עכשיו ערכו של num הוא 50.