בנאי עם פרמטרים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 19 מתוך 104.
בנאי עם פרמטרים מקבל ארגומנטים שמאפשרים לך לאתחל אובייקט עם ערכים מסוימים בזמן יצירתו. במקום להסתמך על ערכי ברירת מחדל, אפשר להתאים אישית את המצב ההתחלתי של כל אובייקט.
class Player {
std::string name;
int health;
int level;
public:
Player(std::string n, int h, int lvl) {
name = n;
health = h;
level = lvl;
}
};
Player hero("Archer", 100, 5);
Player mage("Wizard", 80, 7);אפשר להגדיר כמה בנאים עם פרמטרים ועם רשימות פרמטרים שונות. הדבר נקרא העמסת בנאים, והמהדר בוחר את הבנאי המתאים על סמך הארגומנטים שסיפקת.
class Rectangle {
int width, height;
public:
Rectangle(int side) { // ריבוע
width = height = side;
}
Rectangle(int w, int h) { // מלבן
width = w;
height = h;
}
};
Rectangle square(10); // קורא לבנאי הראשון
Rectangle rect(10, 20); // קורא לבנאי השנילפרמטרים יכולים להיות ערכי ברירת מחדל, וכך חלק מהארגומנטים הופכים לאופציונליים. הדבר מפחית את הצורך במספר בנאים בעלי העמסה יתרה.
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // הערך של damage הוא 10 כברירת מחדל
Enemy dragon("Dragon", 50); // הערך של damage נקבע ל-50זכור מהשיעור הקודם: ברגע שמגדירים בנאי עם פרמטרים, המהדר כבר לא יוצר בנאי ברירת מחדל באופן אוטומטי. אם צריך את שניהם, יש להגדיר את בנאי ברירת המחדל במפורש.
אתגר
קלבואו נבנה מערכת לניהול מלאי מוצרים שמדגימה כיצד בנאים עם פרמטרים מאפשרים ליצור אובייקטים עם ערכים התחלתיים מסוימים, וכיצד העמסת בנאים מספקת גמישות ביצירת אובייקטים.
תיצרו שני קבצים כדי לארגן את הקוד:
Product.h: הגדירו מחלקה בשםProductשמייצגת פריטים במלאי. למחלקה צריכים להיות:- מאפיינים פרטיים עבור
name(מחרוזת),price(מספר ממשי) ו-quantity(מספר שלם) - בנאי שמקבל את שלושת הפרמטרים (name, price, quantity) כדי לאתחל מוצר באופן מלא
- בנאי שמקבל רק name ו-price, כאשר quantity מקבל כברירת מחדל את הערך
1 - בנאי שמקבל רק name, כאשר price מקבל כברירת מחדל את הערך
0.0ו-quantity מקבל כברירת מחדל את הערך0 - מתודה
display()שמדפיסה את פרטי המוצר בפורמט:"<name>: $<price> (x<quantity>)" - מתודה
getTotalValue()שמחזירה את המחיר כפול הכמות
- מאפיינים פרטיים עבור
main.cpp: הדגימו את שלושת הבנאים באמצעות קריאת קלט ויצירת מוצרים בדרכים שונות. קראו מהקלט את הפרטים הבאים:- שורה ראשונה: שם מוצר, מחיר וכמות (מופרדים ברווחים)
- שורה שנייה: שם מוצר ומחיר (מופרדים ברווחים)
- שורה שלישית: שם מוצר בלבד
display()עבור כל אחד מהם, ואז הדפיסו את הערך הכולל של שלושת המוצרים יחד בפורמט:"Total inventory value: $<value>"
בהצגת המחיר, הציגו שתי ספרות אחרי הנקודה העשרונית. לדוגמה, אם תיצרו מוצר בשם "Laptop" במחיר 999.99 ובכמות 5, התצוגה צריכה להציג "Laptop: $999.99 (x5)".
כללו את קובץ הכותרת ב-main.cpp באמצעות #include "Product.h".
נסו בעצמכם
#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// קרא את המוצר הראשון: שם, מחיר וכמות
string name1;
double price1;
int quantity1;
cin >> name1 >> price1 >> quantity1;
// קרא את המוצר השני: שם ומחיר
string name2;
double price2;
cin >> name2 >> price2;
// קרא את המוצר השלישי: שם בלבד
string name3;
cin >> name3;
// TODO: צור שלושה אובייקטים מסוג Product באמצעות הבנאי המתאים לכל אחד
// TODO: קרא ל-display() עבור כל מוצר
// TODO: חשב והדפס את הערך הכולל של המלאי
// פורמט: "Total inventory value: $<value>"
// השתמש ב-fixed וב-setprecision(1) כדי להציג ספרה אחת אחרי הנקודה העשרונית
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++ אונליין