בנאי ברירת מחדל
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 18 מתוך 104.
בנאי ברירת מחדל הוא בנאי שניתן לקרוא לו ללא ארגומנטים. הוא מאתחל אובייקט כשלא מסופקים ערכים התחלתיים. כל מחלקה זקוקה לדרך ליצור אובייקטים במצב ברירת מחדל תקין.
אם לא תגדירו שום בנאי, המהדר ייצור בנאי ברירת מחדל משתמע, שלא עושה דבר עבור טיפוסים פרימיטיביים וקורא לבנאי ברירת המחדל של אובייקטים שהם איברים.
class Player {
int health;
int score;
public:
Player() { // בנאי ברירת מחדל
health = 100;
score = 0;
}
};
Player p1; // קורא לבנאי ברירת המחדל
Player p2{}; // קורא גם לבנאי ברירת המחדלברגע שמגדירים בנאי כלשהו (כמו בנאי עם פרמטרים), המהדר כבר לא יוצר בנאי ברירת מחדל. אם עדיין צריך אותו, יש להגדיר אותו במפורש.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // בנאי עם פרמטרים בלבד
};
Enemy e1(10); // עובד
Enemy e2; // שגיאה! אין בנאי ברירת מחדלב־C++ מודרני, אפשר לבקש במפורש את בנאי ברירת המחדל שנוצר על ידי המהדר באמצעות = default:
class Item {
int id;
public:
Item() = default; // המהדר יוצר בנאי ברירת מחדל
Item(int i) : id(i) {}
};בנאים כברירת מחדל חיוניים ליצירת מערכים של אובייקטים ולמחלקות שמשמשות במכולות כמו std::vector, שעשויות להזדקק לבניית איברים ללא ארגומנטים.
אתגר
קלבואו נבנה מערכת מונה פשוטה שמדגימה כיצד בנאים ברירת מחדל מאתחלים אובייקטים למצב התחלתי תקין.
תיצור שני קבצים כדי לארגן את הקוד שלך:
Counter.h: הגדירו מחלקתCounterשעוקבת אחר ערך מונה. למחלקה שלך צריכים להיות:- מאפיין פרטי
count(מספר שלם) - מאפיין פרטי
name(מחרוזת) לזיהוי המונה - בנאי ברירת מחדל שמאתחל את
countל-0ואתnameל-"Unnamed", ואז מדפיס"Counter created: <name>" - מתודה
increment()שמגדילה את המונה ב-1 - מתודה
getCount()שמחזירה את ערך המונה הנוכחי - מתודה
getName()שמחזירה את שם המונה
- מאפיין פרטי
main.cpp: הדגם שבנאי ברירת המחדל עובדים כשיוצרים אובייקטים בדרכים שונות. קרא מספר מהקלט שמציין כמה פעמים להגדיל את המונה, ואז:- צור Counter באמצעות אתחול ישיר:
Counter c1; - צור Counter נוסף באמצעות אתחול בסוגריים מסולסלים:
Counter c2{}; - הגדל את
c1את מספר הפעמים שצוין בקלט - הדפס
"<name>: <count>"עבור c1 - הדפס
"<name>: <count>"עבור c2
- צור Counter באמצעות אתחול ישיר:
שני המונים צריכים להתחיל ב-0 הודות לבנאי ברירת המחדל שלך, אבל רק c1 יוגדל. כך ניתן לראות כיצד בנאי ברירת מחדל מבטיחים שכל אובייקט יתחיל במצב צפוי ותקין, בלי קשר לאופן שבו הוא נוצר.
כלול את קובץ הכותרת שלך ב-main.cpp באמצעות #include "Counter.h".
נסו בעצמכם
#include <iostream>
#include "Counter.h"
using namespace std;
int main() {
// קראו את מספר הפעמים שיש להגדיל את המונה
int n;
cin >> n;
// TODO: צרו Counter באמצעות אתחול ישיר: Counter c1;
// TODO: צרו Counter נוסף באמצעות אתחול עם סוגריים מסולסלים: Counter c2{};
// TODO: הגדילו את c1 מספר פעמים בהתאם לערך של n
// TODO: הדפיסו "<name>: <count>" עבור c1
// TODO: הדפיסו "<name>: <count>" עבור c2
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין