C++/מחלקות: הבדלים בין גרסאות בדף

נוספו 21 בתים ,  לפני 10 שנים
בנאי הוא פונקציה שאנו מגדירים עבור המחלקה, הוא יופעל בעת היווצרות מופע חדש של מחלקה. תפקיד פונקציה זו הוא לבנות את המחלקה, כלומר לאתחל את משתני המחלקה.
 
עלינו לקרוא ל-init בכל פעם שנרצה לאתחל את המופע של המחלקה שהגדרנו למעלה. דבר זה גורר שגיאות, למשל אם נשכח לקרוא לפונקציה זו לפני השימוש הראשון במשתנה Date. בדומה לאי-אתחול של כל משתנה אחר, גם במשתני המחלקה יהיו ערכים לא מוגדרים - 'זבל'. הבנאים יאפשרו לנו לכתוב פונקציה שתאתחל את המופע שלמופע המחלקה באופן אוטומטי באמצעות ערך חוקי כלשהו. הנה בנאי המאתחל את כל התאריכים ל-01/01/1970 (תוכלו לשנות בנאי זה שיאתחל את התאריך באמצעות התאריך של היום, ע"י שימוש בפונקציות מתאימות מהספרייה ctime):
<div style="direction: ltr;"><source lang="cpp">
class Date
{
int d, m, y;
 
public:
Date()
cout << past.day() << '.' << past.month() << '.' << past.year();
</source></div>
בדוגמה זו יופיע תמיד בפלט 1.1.1970. ניתן להתייחס לבנאי כלפונקציה שמחזירההמחזירה את האובייקטהעצם החדש ולכן, גם מנקודת מבט זו, לא נציין את הטיפוס המוחזר.
 
''הערה:'' לא נוכל לקרוא לבנאי באופן ישיר {{קוד בשורה|past.Date()}} דבר זה נחשב לשגיאה, כי כל אובייקטעצם מאותחל אך ורק פעם אחת.
 
נוכל להוסיף פרמטרים לבנאים שאנו כותבים, נזכור שהעמסת בנאים מותרת כמו העמסת שאר הפונקציות. לכן נוכל להגדיר בנאי המאתחל את האובייקטהעצם באמצעות הערכים הנמסרים לו כפרמטרים, הוא יחליף לנו את הפונקציה init. בדוגמה הבאה יש להוסיף את בדיקת תקינות הפרמטרים ולהחליט על דרך פעולה כלשהי כאשר הפרמטרים לא תקינים (למשל לזרוק חריגה):
<div style="direction: ltr;"><source lang="cpp">
class Date
{
int d, m, y;
 
public:
Date()
{
d = 1, m = 1, y = 1970;
}
Date(int dd, int mm, int yy)
{
}
// ...
};</source></div>
};
</source></div>
כאן העמסנו בנאי נוסף לבנאי הקודם. כדי למסור פרמטרים לבנאי כלשהו בעת אתחול המשתנה, נרשום אותם בסוגריים עגולים לאחר שם המשתנה (''הערה:'' אם אין פרמטרים אז אין לרשום סוגריים כלל):
<div style="direction: ltr;"><source lang="cpp">