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

נוספו 2,260 בתים ,  לפני 15 שנים
אין תקציר עריכה
בשפת C++ ישנם אופרטורים אוּנָרִיים (בעלי אופרנד אחד), בִינָרִיים (בעלי שני אופרנדים), טֵרְנָרִיים (בעלי שלושה אופרנדים) ואפילו אופרטור קריאה לפונקציה () שמספר האופרנדים בו משתנה. כנאמר למעלה, חלק מהאופרטורים אנו יכולים להגדיר כחברי המחלקה, חלק כפונקציות סטטיות, וחלק אין באפשרותינו להעמיס.
 
להלן רשימת* אופרטורים בינאריים הניתנים להעמסה גם כפונקציות המחלקה וגם כפונקציות סטטיות. אם נגדיר אותם כפונקציות סטטיות אז יהיו להן שני פרמטרים, אם נגדיר אותן כחברי מחלקה יהיה להן פרמטר אחד:
<div style="direction: ltr;"><source lang="cpp">
+ - * / % & | ^ ,
</source></div>
 
להלן רשימת* אופרטורים בינאריים הניתנים להעמסה רק בתוך המחלקה, לפונקציות אופרטורים אלה יהיה פרמטר אחד תמיד:
<div style="direction: ltr;"><source lang="cpp">
= += -= *= /= %= &= |= ^= <<= >>= [] ->*
</source></div>
 
* אופרטורים אונריים הניתנים להעמסה מחוץ למחלקה הם, לפונקציות אופרטורים אלה יהיה פרמטר אחד כשהם מחוץ למחלקה ולא יהיו להן פרמטרים כלל כשהם בתוך המחלקה:
<div style="direction: ltr;"><source lang="cpp">
~ ! - + *
</source></div>
 
* אופרטורים אונריים הניתנים להעמסה רק בתוך המחלקה הם, לפונקציות אופרטורים אלה אף פעם לא יהיו פרמטרים:
<div style="direction: ltr;"><source lang="cpp">
-> ++ -- &
וכתוצאה יודפס: {{קוד בשורה|<nowiki>pos = (12.0, 32.0)</nowiki>}}.
 
=== הגדלההוספה והפחתה ===
 
האופרטורים ++ ו-- קיימים בשתי גרסות:
* הנכתבים לפני האופרנד (prefix) - עבור הטיפוסים המובנים הם תחילה משנים (מוסיפים או מפחיתים) את האופרנד ולאחר מכן מחזירים את ערכו החדש.
* הנכתבים אחרי האופרנד (postfix) - התוצאה שתוחזר תהיה הערך הישן של האופרנד.
 
כאשר אנו מעמיסים אופרטורים אלה עבור המחלקה שלנו עלינו לציין לאיזה גרסה אנו מתכוונים. כדי להעמיס את האופרטור ה-prefix נגדיר פונקצייה ללא פרמטרים, כדי להעמיס את האופרטור ה-posrfix נוסיף לפונקציית האופרטור פרמטר int חסר שם שכל תפקידו הוא לציין למהדר שזהו אופרטור postfix.
 
דוגמה:
<div style="direction: ltr;"><source lang="cpp">
struct X
{
int val;
 
X& operator ++ () // ++Prefix
{
++val;
return *this;
}
 
X operator ++ (int) // Postfix++
{
X tmp = *this;
++val;
return tmp;
}
};
</source></div>
 
קיימת אמונה עיוורת שהאופרטור ההוספה או ההפחתה שאחרי פוגע ביעילות התוכנית. הדבר הזה לא תמיד נכון, למשל אין שום סיבה להעדיף אופרטור זה או אחר בקידום מונה הלולאה שהוא טיפוס מובנה. כיוון שאין אנו משתמשים בערך המוחזר מהאופרטור, רוב המהדרים המודרניים לא יעשו עותק של המונה אפילו מבלי שנבקש לעשות אופטימיזציה.
 
כאשר אנו מעמיסים אופרטור שלנו, אכן יווצר עותק של האובייקט, הרי כתבנו את הדבר באופן מפורש (ראו דוגמה שלמעלה). אומנם אם פונקצית האופרטור שלנו פשוטה, יחד עם ציון פונקציה זו כ-inline וציון אופטימיזציה למהדר, קוד המכונה הסופי יהיה לרוב זהה בשתי הגרסות. לפעמים שימוש באופרטור postfix עוזר לקצר את הקוד ולעשות אותו ברור יותר.
 
=== פעולות למצביעים ומערכים ===
204

עריכות