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

תוכן שנמחק תוכן שנוסף
Ybungalobill (שיחה | תרומות)
Ybungalobill (שיחה | תרומות)
שורה 162:
 
=== פעולות למצביעים ומערכים ===
 
באמצעות העמסת האופרטורים האופיניים לעבודה עם מערכים ומצביעים ({{קוד בשורה|* & [] ->}}) נוכל להגדיר טיפוסים אשר מתנהגים בדומה למצביעים ומערכים אך מבצעים פעולות נוספות כלשהן. בין השאר נוכל להוסיף בדיקה לתקינות המצביעים או מצביעים מופשטים עבור אוספים של אובייקטים (iterators).
 
אופרטורים אלה מועמסים בדומה לשאר האופרטורים שצוינו, אמנם נפרט:
* אופרטור האינדקסציה [] מקבל כפרמטר את האינדקס שיכול להיות כל טיפוס שהוא (למשל מחרוזת, או טיפוס המייצג "טווח" של אינדקסים). כדי שנוכל להשים ערך באמצעות אחד אופרטורי ההשמה, אופרטור זה צריך להחזיר ייחוס לאיזשהו אובייקט.
* את האופרטור * נעמיס בדומה ל-[] למעט ההבדל היחידי שהוא אונרי ולא מקבל פרמטרים.
* האופרטור {{קוד בשורה|->}} הינו אופרטור מבלבל. הסיבה לכך היא שהוא נראה כמו אופרטור בינארי, אומנם אנו מגדירים אותו כאילו שהוא אונרי. אופרטור זה זהה לאופרטור * מלבד התחביר במקום הקריאה.
* אופרטור & מוגדר כברירת מחדל לכל מחלקה, ומשמעותו הרגילה היא "כתובת האובייקט בזיכרון", אומנם ניתן לשנות משמעות ברירת מחדל זו על ידי העמסה.
 
להלן דוגמה של מצביע "חכם" אשר בודק את נכונותו בכל רגע בו אנו מנסים לקרוא או לכתוב למערך אליו הוא מצביע:
<div style="direction: ltr;"><source lang="cpp">
class CheckedPtr
{
X *begin, *cur, *end; // מצביעים להתחלה לאמצע ולסוף של האזור
 
void check(X *p) const
{
if(p < begin || p >= end)
// חריגה (למד בהמשך), יצאנו מגבולות המערך
throw "Out of range";
}
 
public:
CheckedPtr(X *arr, size_t size, int ind) :
begin(arr), end(arr+size), cur(arr+ind) { }
 
CheckedPtr& operator ++ ()
{
cur++;
return *this;
}
 
CheckedPtr& operator -- () { /* ... */ }
CheckedPtr& operator += (int) { /* ... */ }
// עוד אופרטורים לשינוי המצביע
 
X& operator [] (int i) const
{
X *ptr = cur + i;
check(ptr);
return *ptr;
}
 
X& operator * () const
{
check(cur);
return *cur;
}
 
X& operator -> () const { /* בדיוק כמו אופרטור הכוכבית */ }
};
</source></div>
הנה דוגמה לשימוש במצביע זה, נניח ש-X הוא טיפוס מוגדר מראש (בתוכנית אמיתית עדיף לשכתב מחלקה זו לתבנית):
<div style="direction: ltr;"><source lang="cpp">
X arr[100];
CheckedPtr p(arr, 100, 0);
 
(*p).print(); // מדפיס את arr[0]
p++;
p->print(); // מדפיס את arr[1]
p[99].print(); // שגיאה בזמן ריצה, מנסה להדפיס את arr[100]
p[-1].print(); // מדפיס את arr[0]
</source></div>
 
=== אופרטור קריאה לפונקציה ===