אופרטורי זרם
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 43 מתוך 104.
אופרטורי ההכנסה (<<) והחילוץ (>>) מאפשרים לך להשתמש במחלקות המותאמות אישית שלך עם std::cout ועם std::cin. בניגוד לאופרטורים שעסקנו בהם עד כה, יש לממש אותם כפונקציות שאינן חברות, משום שהאופרנד השמאלי הוא זרם ולא המחלקה שלך.
class Point {
int x, y;
public:
Point(int x, int y) : x(x), y(y) {}
// יש להכריז כ־friend כדי לגשת לחברים פרטיים
friend std::ostream& operator<<(std::ostream& os, const Point& p);
friend std::istream& operator>>(std::istream& is, Point& p);
};
std::ostream& operator<<(std::ostream& os, const Point& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
std::istream& operator>>(std::istream& is, Point& p) {
is >> p.x >> p.y;
return is;
}שני האופרטורים מחזירים הפניה לזרם, ומאפשרים לשרשר פעולות כמו std::cout << p1 << p2. אופרטור ההכנסה מקבל את האובייקט בהפניה מסוג const מכיוון שהוא רק קורא נתונים, ואילו אופרטור החילוץ מקבל הפניה שאינה מסוג const מכיוון שהוא משנה את האובייקט.
עכשיו אפשר להשתמש ב־Point באופן טבעי עם זרמים:
Point p(3, 4);
std::cout << "Location: " << p << std::endl; // פלט: Location: (3, 4)
Point p2(0, 0);
std::cin >> p2; // קרא שני מספרים שלמים לתוך p2אתגר
קלבואו נבנה מחלקה Temperature שאפשר להשתמש בה באופן חלק עם std::cout ועם std::cin באמצעות העמסת אופרטורים של זרמים. זהו תרחיש מעשי שבו רוצים להציג טמפרטורות בפורמט קריא ולקלוט אותן באופן טבעי.
תיצרו שני קבצים כדי לארגן את הקוד:
Temperature.h: הגדירו מחלקהTemperatureששומרת ערך של טמפרטורה (בתורdouble) ותווית יחידה (בתורchar, או'C'עבור צלזיוס או'F'עבור פרנהייט). המחלקה צריכה לכלול:- איברים פרטיים עבור ערך הטמפרטורה והיחידה
- בנאי ברירת מחדל שמאתחל ל־0.0 מעלות צלזיוס
- בנאי עם פרמטרים שמקבל ערך ויחידה
- פונקציות הגישה
getValue()ו־getUnit()(שתיהן const) - הצהרות friend עבור אופרטורי ההכנסה (
<<) וההוצאה (>>) של זרמים
ממשו את אופרטורי הזרמים כפונקציות שאינן איברים במחלקה:
- אופרטור ההכנסה צריך להציג את הטמפרטורה בפורמט
VALUE UNIT(למשל,25.5 Cאו77.9 F). השתמשו בספרה אחת אחרי הנקודה העשרונית עבור הערך. - אופרטור ההוצאה צריך לקרוא ערך ותו יחידה מהזרם ולאחסן אותם באובייקט Temperature.
שני האופרטורים חייבים להחזיר הפניה לזרם כדי לאפשר שרשור.
main.cpp: קראו שתי טמפרטורות מהקלט. כל טמפרטורה מופיעה בשורה נפרדת בפורמטvalue unit(למשל,25.5 C).צרו שני אובייקטים מסוג
Temperatureבאמצעות אופרטור ההוצאה כדי לקרוא אותם מתוךstd::cin. לאחר מכן הציגו אותם באמצעות אופרטור ההכנסה בפורמט הזה:Temperature 1: <temp1> Temperature 2: <temp2>לדוגמה, אם הקלט הוא:
25.5 C 98.6 Fהפלט צריך להיות:
Temperature 1: 25.5 C Temperature 2: 98.6 F
השתמשו ב־std::fixed וב־std::setprecision(1) מתוך <iomanip> כדי לעצב את ערך הטמפרטורה כך שיוצג עם ספרה אחת בדיוק אחרי הנקודה העשרונית. אל תשכחו להוסיף guards לכותרת בקובץ הכותרת.
נסו בעצמכם
#include <iostream>
#include "Temperature.h"
int main() {
// TODO: צרו שני אובייקטים מסוג Temperature
// TODO: השתמשו באופרטור החילוץ (>>) כדי לקרוא שתי טמפרטורות מ־std::cin
// TODO: הציגו את הטמפרטורות באמצעות אופרטור ההכנסה (<<)
// תבנית:
// Temperature 1: <temp1>
// Temperature 2: <temp2>
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++ אונליין