Προς το περιεχόμενο

Υπερφορτωνοντας το operator+


thanantypas

Προτεινόμενες αναρτήσεις

Δημοσ.

Μπορει καποιος να μου πει καποιος τι σημαινει:

Counter Counter::operator+(const Counter & rhs)

{ return Counter(itsVal+rhs.GetitsVal());

}

//διαβαζω για την υπερ . τελεστων και δεν μπορω να καταλαβω τι σημαινει το rhs??

//ξερει κανενας γιατι το βαζει?

 

το ξερω οτι η ερωτηση ειναι λιγο :-(:-( για εσας αλλα δεν μπορω να καταλαβω..

Δημοσ.

to rhs ειναι το αντικείμενο που θα προστεθει η τιμή του με το τρέχον αντικείμενο που καλει την συναρτηση... δηλαδη αν πεις για τρία αντικείμενα τύπου Counter Α και B και C οτι C = Α + Β τότε ειναι σαν να λες C = Α.+(Β)

Δημοσ.

rhs = Right Hand Side

ονομάζεται συνήθως έτσι η παράμετρος ώστε να θυμίζει ότι πρόκειται για το αντικείμενο δεξιά από τον τελεστή (αριστερά είναι το this).

Δημοσ.

Να προσθέσω ότι στους binary operators +, -, *, /, % καλώ είναι να υπάρχει το const μπροστά απο τον τύπο επιστροφής όπως παρακάτω:

>const Counter Counter::operator+(const Counter& rhs)
{ 
   return Counter(itsVal+rhs.GetitsVal());
}

Αυτό είναι χρήσιμο για την αποφυγή περίεργων καταστάσεων όπως:

>Counter a, b, c;
a + b = c;

Δημοσ.
Ακριβως... Λογικα για να δουλεψει και το = θελει και αυτο υπερφορτωση αν δεν κανω λαθος...

 

Λάθος κάνεις, ΔΕΝ απαιτείται υπερφόρτωση.

Το

>
Counter Counter:οperator+(const Counter & rhs)
{   return Counter(itsVal+rhs.GetitsVal());  }

σημαίνει ότι o compiler δημιουργεί με τον constructor του Counter ένα νέο, προσωρινό αντικείμενο Counter, το Counter(itsVal+rhs.GetitsVal()), και επιστρέφει ένα αντίγραφό του.

Αν γράψεις C= A+ B , δηλ. a2 = a1, χρησιμοποιείται το = κατά τον προεπιλεγμένο τρόπο ο οποίος είναι να αντιγράφονται τα δεδομένα του a1 μέλος προς μέλος στο α2.

Ωστόσο αυτή η προεπιλεγμένη λειτουργία δεν είναι πάντα επιθυμητή (πχ. στην περίπτωση δεικτών γίνεται shallow copy) και τότε η υπερφόρτωση του = είναι απαραίτητη για

να δώσει σωστό αποτέλεσμα.

Εξάλλου, έχε υπόψη σου ότι το = είναι ο μοναδικός τελεστής που δεν κληρονομείται.

 

Επιπλέον, για να δουλέψει η υπερφόρτωση του + στην C=Α+Β πρέπει το αριστερό όρισμα του + , δηλ το Α, να είναι τύπου Counter.

Θα μπορούσες πχ. να γράψεις C= B + 10 αν υπάρχει κατάλληλος constructor ώστε να μετατραπεί το 10 σε αντικείμενο τύπου Counter.

Aλλά η ισότητα C = 10 + B είναι απαράδεκτη (εκτός αν το + δηλωθεί friend στην κλάση).

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...