User Tools

Site Tools


cpp:operator_overloading

This is an old revision of the document!


Υπερφόρτωση τελεστών

Η C++ επιτρέπει την υπεφόρτωση των περισσότερων από τους διαθέσιμους τελεστές της γλώσσας. Με τον όρο υπεφόρτωση εννοούμε τον ορισμό μιας νέας συμπεριφοράς για τον τελεστή όταν αυτός εφαρμόζεται όχι σε βασικούς τύπους δεδομένων, αλλά σε αναφορικούς τύπους δεδομένων. Για παράδειγμα, στην παρακάτω κλάση Time τι θα γίνει εάν προσθέσουμε δύο αντικείμενα της κλάσης αυτής;

Time.cpp
class Time {
  int minutes;
  int hours;
public:
  Time(int hours, int minutes) {
    if(hours >= 0)
      this->hours = hours;
    else 
      this->hours = 0;
    if(minutes >= 0)
      this->minutes = minutes;
    else
      this->minutes = 0;
  }
  int getMinutes() { return minutes; }
  int getHours() { return hours; }
};
 
int main() {
  Time t1(10,30), t2(12, 50);
  Time t3 = t1 + t2;
}

Προς το παρόν αυτό που θα συμβεί είναι ότι ο παραπάνω κώδικας δεν μεταγλωττίζεται καθώς δεν ορίζεται κάποια συμπεριφορά για τον τελεστή + όταν αυτός εφαρμόζεται σε αντικείμενα τύπου Time. Αυτό μπορεί να αλλάξει εάν ορίσουμε μία συμπεριφορά για αυτό τον τελεστή επαναφορτώνοντας τον ως εξής.

Time.cpp
#include <iostream>
class Time {
  int minutes;
  int hours;
public:
  Time(int hours, int minutes) {
    if(hours >= 0)
      this->hours = hours;
    else 
      this->hours = 0;
    if(minutes >= 0)
      this->minutes = minutes;
    else
      this->minutes = 0;
  }
  Time operator+(const Time &t) {
    Time f(hours, minutes);
    f.minutes += t.minutes;
    if(f.minutes>=60)
      f.minutes -= 60;
    f.hours++;
    f.hours += t.hours;
    if(f.hours > 24)
      f.hours -= 24;
    return f;
  }
  int getMinutes() { return minutes; }
  int getHours() { return hours; }
};
 
int main() {
  Time t1(10,30), t2(12, 50);
  Time t3 = t1 + t2;
  std::cout << "t3: " << t3.getHours() <<"H, " << t3.getMinutes() << "m\n";
}
cpp/operator_overloading.1493215221.txt.gz · Last modified: 2017/04/26 13:00 (external edit)