מבוא להעמסת אופרטורים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 40 מתוך 104.
העמסת אופרטורים מאפשרת לך להגדיר כיצד אופרטורים כמו +, - או == מתנהגים כשמשתמשים בהם עם מחלקות מותאמות אישית. במקום לקרוא למתודות כמו a.add(b), אפשר לכתוב את הביטוי האינטואיטיבי יותר a + b.
ב-C++, אופרטורים הם למעשה פונקציות בעלות שמות מיוחדים. כדי להעמיס אופרטור, מגדירים פונקציה באמצעות מילת המפתח operator ולאחריה הסמל:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// העמיסו את האופרטור +
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};עכשיו אפשר לחבר שני וקטורים באופן טבעי:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // קורא ל־v1.operator+(v2)לא ניתן להעמיס את כל האופרטורים. אי אפשר להעמיס את אופרטור פתרון התחום ::, גישה לאיבר ., האופרטור הטרנרי ?: ו-sizeof. בנוסף, אי אפשר ליצור אופרטורים חדשים או לשנות את הקדימות של אופרטור — * תמיד יחושב לפני +.
אפשר לממש אופרטורים כפונקציות איבר (כמו למעלה) או כפונקציות שאינן פונקציות איבר. בשיעורים הבאים תלמדו מתי להשתמש בכל אחת מהגישות וכיצד להעמיס קטגוריות מסוימות של אופרטורים.
אתגר
קלנבנה מחלקת Point שמייצגת קואורדינטה דו־ממדית ותומכת בחיבור של שתי נקודות באמצעות האופרטור +. זהו הצעד הראשון שלך בעולם העמסת אופרטורים, שמאפשר למחלקות מותאמות אישית לעבוד עם אופרטורים מוכרים.
תיצור שני קבצים כדי לארגן את הקוד שלך:
Point.h: הגדר מחלקתPointששומרת את קואורדינטות x ו-y (שתיהן מסוגint). המחלקה שלך צריכה לכלול:- חברים פרטיים עבור קואורדינטות x ו-y
- בנאי שמקבל ערכי x ו-y
- פונקציות גישה
getX()ו-getY()(שתיהן const) - אופרטור
+מועמס, שמחבר שתי נקודות ומחזירPointחדשה עם הקואורדינטות המשולבות
יש לממש את האופרטור
+כפונקציית חברה שמקבלתPointאחרת באמצעות הפניה const ומחזירהPointחדשה. יש לסמן אותה בתורconstמכיוון שהיא לא משנה אף אחד מהאופרנדים.main.cpp: קרא ארבעה מספרים שלמים מהקלט (x1, y1, x2, y2 בשורות נפרדות) שמייצגים שתי נקודות. צור שני אובייקטים מסוגPoint, חבר אותם באמצעות האופרטור+והצג את התוצאות.פורמט הפלט:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
התובנה המרכזית כאן היא ש-p1 + p2 למעשה קורא מאחורי הקלעים ל-p1.operator+(p2). האופרטור שהעמסת מאפשר לכתוב קוד אינטואיטיבי כמו Point p3 = p1 + p2; במקום משהו כמו Point p3 = p1.add(p2);.
המר את מחרוזות הקלט למספרים שלמים באמצעות std::stoi(). אל תשכח לכלול מגני כותרת בקובץ הכותרת שלך.
נסו בעצמכם
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// קרא את הקלט
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: צור שני אובייקטים מסוג Point באמצעות ערכי הקלט
// TODO: חבר את שתי הנקודות באמצעות האופרטור +
// TODO: הצג את התוצאות בפורמט הנדרש:
// Point 1: (<x1>, <y1>)
// Point 2: (<x2>, <y2>)
// Sum: (<sum_x>, <sum_y>)
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++ אונליין