Menu
Coddy logo textTech

מבוא להעמסת אופרטורים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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. בנוסף, אי אפשר ליצור אופרטורים חדשים או לשנות את הקדימות של אופרטור — * תמיד יחושב לפני +.

אפשר לממש אופרטורים כפונקציות איבר (כמו למעלה) או כפונקציות שאינן פונקציות איבר. בשיעורים הבאים תלמדו מתי להשתמש בכל אחת מהגישות וכיצד להעמיס קטגוריות מסוימות של אופרטורים.

challenge icon

אתגר

קל

נבנה מחלקת 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;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C++ אונליין