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

אין תקציר עריכה
אין תקציר עריכה
אין תקציר עריכה
 
תחילה יתבצע הביטוי {{קוד בשורה|<nowiki>(bar += foo)</nowiki>}}, ערך משתנה bar יהפוך ל-{{קוד בשורה|<nowiki>{6.0, -4.0}</nowiki>}}, ביטוי זה יחזיר משתנה יחוס ל-bar אשר ישמש לנו כאופרנד לפעולת ההשמה. כשתתבצע פעולת ההשמה, יועתק ערכו החדש של bar למשתנה foo.
 
''הערה:'' אין צורך בסוגריים בביטוי זה כיוון שפעולות ההשמה מתבצעות מימין לשמאל (ולא משמאל לימין כמו פעולות חשבוניות אחרון).
 
== קריאה לפונקציית האופרטור ==
 
כאמור פונקציית האופרטור היא פונקציה רגילה בעלת שם מיוחד, אשראך ניתן לקרוא לה בצורה קצרה, ע"י שימוש בסימן האופרטור. נוכל לקרוא לפונקציית האופרטור באופן גלוי, בעמצעותבאמצעות שמה המלא, להלן שתי שורות מהדוגמות שלמעלה בהן קוראים לפונקציות האופרטור בדרך זו:
<div style="direction: ltr;"><source lang="cpp">
Vector2D klop = operator + (foo, bar);
 
לעיתים לא תהיה לנו ברירה אלא לציין שם מלא זה, למשל כשנרצה לקבל מצביע לפונקציית האופרטור.
 
כל הגדרה של אופרטור נוסף היא העמסה שלו לאופרטוים הקיימים, כולל אלה המובנים בשפה. נוכל להעמיס פונקציות רבות עבור אותו האופרטור כשהן נבדלות בטיפוס האופרנדים שלהן. במקרה זה ישתמש המהדר באותם כללים כמו בהעמסת פונקציות כדי להחליט לאיזה מן האופרטורים לקרוא. דוגמות ראו בהמשך הפרק.
 
''טיפ:'' כשתתקלו בביטוי מסובך ולא ברור נסו לדמיין או לכתוב אותו בצורה כזאת ולהבין אילו בדיוק אופרטורים נקראים לפי טיפוסי האופרנדים שלהם.
 
== פרטי האופרטורים הניתנים להעמסה ==
כל הגדרה של אופרטור נוסף היא העמסה שלו לאופרטוים הקיימים, כולל אלה המובנים בשפה. נוכל להעמיס פונקציות רבות עבור אותו האופרטור כשהן נבדלות בטיפוס האופרנדים שלהן. במקרה זה ישתמש המהדר באותם כללים כמו בהעמסת פונקציות כדי להחליט לאיזה מן האופרטורים לקרוא. דוגמות ראו בהמשך הפרק.
 
בשפת C++ ישנם אופרטורים אוּנָרִיים (בעלי אופרנד אחד), בִינָרִיים (בעלי שני אופרנדים), טֵרְנָרִיים (בעלי שלושה אופרנדים) ואפילו אופרטור קריאה לפונקציה () שמספר האופרנדים בו משתנה. כנאמר למעלה, חלק מהאופרטורים אנו יכולים להגדיר כחברי המחלקה, חלק כפונקציות סטטיות, חלק מותר גם כך וגם כך וחלק אין באפשרותינו להעמיס.
 
בחלק זה נחלק את האופרטורים למספר קטגוריות כדי להקל את ההבנה. נפרט על כל קטגוריה בנפרד.
 
=== פעולות חשבוניות בינאריות ===
 
נייחס לקטגוריה זו את הפעולות המתמטיות ואת הפעולות על סיביות:
<div style="direction: ltr;"><source lang="cpp">
+ - * / %
& | ^ >> <<
</source></div>
אופרטורים אלה נוכל להגדיר גם כחברי המחלקה וגם כאופרטורים סטטיים (בתוך מרחב שם, כולל גולובלי). כיוון שאופרטורים אלה הם בינאריים הם מקבלים שני אופרנדים.
 
אם אופרטורים אלה הם חברי מחלקה אז האופרנד הראשון יהיה המופע של המחלקה עבורו נקראת פונקציית האופרטור, ואילו האופרנד השני יתקבל דרך הפרמטר היחידי של אותה הפונקציה. לרוב אופרטורים כאלה לא משנים את האובייקט עצמו אלא מחזירים אובייקט חדש, במקרה זה נגדיר אותם כפונקציות const (אפשר לעשות גם אחרת, אם נרצה למשל ש>> ישנה את האופרנד שלו).
 
אם אופרטורים אלה לא יהיו חברי מחלקה, אזי שני הפרמטרים שלהם ייצגו את האופרנדים. למשל:
<div style="direction: ltr;"><source lang="cpp">
struct A {
// ...
A operator * (const A& x) const; // בסדר גמור
A operator + (const A& x, const A& y) const; // שגיאה, יותר מדי פרמטרים - צריך 1 או 0
};
A operator % (const A& x); // שגיאה, חסרים פרמטרים - צריך 2
A operator / (const A& x, int y); // עובד
void operator - (A& x, const A& y); // מותר להחזיר כל ערך, אבל זה יבלבל
</source></div>
 
זיכרו שהעמסת אופרטורים, מטרתה להקל את הבנת הקוד, לכן לא כדאי להגדיר אופרטורים שלא יתאימו למשמעותם האינטואיטיבית. באופרטור האחרון נצטרך להתשמש כך: {{קוד בשורה|a - b;}} כאשר a, ו-b הם משתנים מטיפוס A. במקרה זה האופרטור לא מחזיר ערך אלה משנה את האופרנד הראשון שלו (a), מה שלא משתלב עם משמעות הסימן '-' אליה אנו רגילים.
 
המהדר לא יחליף את סדר האופרנדים מעצמו בשום מקרה, לכן, בהנתן ההגדרות שלמעלה, לא נוכל לכתוב {{קוד בשורה|100/a}}, אולם מותר לכתוב {{קוד בשורה|a/100}}.
 
=== פעולות לוגיות ופעולות השוואה ===
 
=== פעולות השמה ===
 
=== פעולות אונריות ===
 
=== הגדלה והפחתה ===
 
=== פעולות למצביעים ומערכים ===
 
=== אופרטור קריאה לפונקציה ===
 
=== העמסת new ו-delete ===
204

עריכות