This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
cpp:constructors_destructors [2017/04/16 05:01] gthanos [Χρήση member initialization list για την αρχικοποίηση των μελών της κλάσης] |
cpp:constructors_destructors [2020/04/08 10:25] gthanos [Αρχικοποίηση αντικειμένων που περιέχουν πεδία που περιγράφονται από κλάσεις] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Κατασκευαστές και καταστροφείς της κλάσης ====== | ====== Κατασκευαστές και καταστροφείς της κλάσης ====== | ||
| - | Στο προηγούμενο παράδειγμα της κλάσης // | + | Στο προηγούμενο παράδειγμα της κλάσης // |
| - | < | + | < |
| #include < | #include < | ||
| using namespace std; | using namespace std; | ||
| Line 14: | Line 14: | ||
| void setWidth(int w); | void setWidth(int w); | ||
| void setHeight(int h); | void setHeight(int h); | ||
| - | int getWidth(); | + | int getWidth() |
| - | int getHeight(); | + | int getHeight() |
| }; | }; | ||
| Line 24: | Line 24: | ||
| void Rectangle:: | void Rectangle:: | ||
| void Rectangle:: | void Rectangle:: | ||
| - | int Rectangle:: | + | int Rectangle:: |
| - | int Rectangle:: | + | int Rectangle:: |
| + | </ | ||
| + | |||
| + | <code cpp RectangleUsage.cpp> | ||
| + | #include " | ||
| int main () { | int main () { | ||
| Line 34: | Line 38: | ||
| </ | </ | ||
| - | <WRAP center round tip 80%> | + | <WRAP center round info 80%> |
| Σε αναλογία με τις μεθόδους ο κατασκευαστής μπορεί να οριστεί εντός της κλάσης, | Σε αναλογία με τις μεθόδους ο κατασκευαστής μπορεί να οριστεί εντός της κλάσης, | ||
| <code c++ Rectangle.cpp> | <code c++ Rectangle.cpp> | ||
| Line 52: | Line 56: | ||
| Εάν δεν οριστεί κανένας κατασκευαστής σε μία κλάση τότε για την κλάση ορίζεται από τον μεταγλωττιστή ο //default// κατασκευαστής. Ο κατασκευαστής αυτός δεν έχει ορίσματα. Τα πεδία της κλάσης αρχικοποιούνται ως εξής: | Εάν δεν οριστεί κανένας κατασκευαστής σε μία κλάση τότε για την κλάση ορίζεται από τον μεταγλωττιστή ο //default// κατασκευαστής. Ο κατασκευαστής αυτός δεν έχει ορίσματα. Τα πεδία της κλάσης αρχικοποιούνται ως εξής: | ||
| - για πεδία που έχουν βασικού τύπους (int, double, char κλπ) οι τιμές είναι τυχαίες. | - για πεδία που έχουν βασικού τύπους (int, double, char κλπ) οι τιμές είναι τυχαίες. | ||
| - | - για πεδία | + | - για πεδία |
| - | Εάν έχετε δηλώσει τουλάχιστον ένα κατασκευαστή που δεν είναι ο //default// κατασκευαστής χωρίς παραμέτρους τότε ο μεταγλωττιστής | + | Εάν έχετε δηλώσει τουλάχιστον ένα κατασκευαστή που δεν είναι ο //default// κατασκευαστής χωρίς παραμέτρους τότε ο // |
| ===== Υπερφόρτωση κατασκευαστών ===== | ===== Υπερφόρτωση κατασκευαστών ===== | ||
| - | Σε αναλογία με την [[cpp: | + | Σε αναλογία με την [[cpp: |
| - | < | + | < |
| #include < | #include < | ||
| #include < | #include < | ||
| Line 75: | Line 79: | ||
| void setWidth(int w); | void setWidth(int w); | ||
| void setHeight(int h); | void setHeight(int h); | ||
| - | int getWidth(); | + | int getWidth() |
| - | int getHeight(); | + | int getHeight() |
| }; | }; | ||
| Line 94: | Line 98: | ||
| void Rectangle:: | void Rectangle:: | ||
| void Rectangle:: | void Rectangle:: | ||
| - | int Rectangle:: | + | int Rectangle:: |
| - | int Rectangle:: | + | int Rectangle:: |
| + | |||
| + | </ | ||
| + | |||
| + | <code cpp RectangleUsage.cpp> | ||
| + | #include " | ||
| int main () { | int main () { | ||
| Line 107: | Line 116: | ||
| Παραπάνω συναντήσαμε τον κατασκευαστή με δύο ορίσματα | Παραπάνω συναντήσαμε τον κατασκευαστή με δύο ορίσματα | ||
| - | < | + | < |
| Rectangle:: | Rectangle:: | ||
| width = w; height = h; | width = w; height = h; | ||
| Line 114: | Line 123: | ||
| Αντί για την παραπάνω δήλωση θα μπορούσατε να γράψετε ισοδύναμα: | Αντί για την παραπάνω δήλωση θα μπορούσατε να γράψετε ισοδύναμα: | ||
| - | < | + | < |
| Rectangle:: | Rectangle:: | ||
| height = h; | height = h; | ||
| Line 120: | Line 129: | ||
| </ | </ | ||
| ή | ή | ||
| - | < | + | < |
| Rectangle:: | Rectangle:: | ||
| </ | </ | ||
| - | Ο παραπάνω τρόπος αρχικοποίησης μπορεί να επεκταθεί και να χρησιμοποιηθεί για την κλήση κατασκευαστών των πεδίων της κλάσης. Δείτε | + | Τελικά η κλάση Rectangle |
| - | < | + | |
| - | Cuboid::Cuboid(Rectangle | + | <code cpp Rectangle.hpp> |
| - | Cuboid:: | + | #include < |
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | class Rectangle { | ||
| + | private: | ||
| + | int width, height; | ||
| + | public: | ||
| + | Rectangle(int w, int h); | ||
| + | Rectangle(int s); | ||
| + | Rectangle(); | ||
| + | void setWidth(int w); | ||
| + | void setHeight(int h); | ||
| + | int getWidth() const; | ||
| + | int getHeight() const; | ||
| + | }; | ||
| + | |||
| + | Rectangle:: | ||
| + | } | ||
| + | |||
| + | Rectangle:: | ||
| + | } | ||
| + | |||
| + | Rectangle:: | ||
| + | srand(time(NULL)); | ||
| + | width = rand() % 10 + 1; height = rand() % 10 + 1; | ||
| + | } | ||
| + | |||
| + | void Rectangle:: | ||
| + | void Rectangle:: | ||
| + | int Rectangle:: | ||
| + | int Rectangle:: | ||
| + | </ | ||
| + | |||
| + | ===== Κλήση ενός | ||
| + | |||
| + | Συχνά | ||
| + | |||
| + | <code cpp> | ||
| + | Rectangle:: | ||
| + | Rectangle(s, | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | O ίδιος κώδικας | ||
| + | |||
| + | < | ||
| + | Rectangle::Rectangle(int s) : Rectangle(s,s) { | ||
| + | } | ||
| </ | </ | ||
| - | Στην 1η περίπτωση γίνεται ανάθεση του | + | ===== Αρχικοποίηση αντικειμένων που περιέχουν πεδία που περιγράφονται από κλάσεις ===== |
| - | Για | + | Στην προηγούμενη ενότητα είδαμε την κλάση Cuboid που περιγράφει την κλάση του κυβοειδούς και περιέχει ένα πεδίο |
| - | < | + | < |
| #include < | #include < | ||
| using namespace std; | using namespace std; | ||
| - | #include " | + | #include " |
| class Cuboid { | class Cuboid { | ||
| Line 145: | Line 203: | ||
| Rectangle rect; | Rectangle rect; | ||
| public: | public: | ||
| - | Cuboid(Rectangle r, int l); | ||
| Cuboid(int w, int h, int l); | Cuboid(int w, int h, int l); | ||
| - | void setRectangle(Rectangle r) {rect = r;} | + | |
| - | Rectangle getRectangle() | + | |
| - | void setLength(int l) { length = l; } | + | |
| - | int getLength() | + | Rectangle getRectangle() |
| + | void setLength(int l); | ||
| + | int getLength() | ||
| int volume(); | int volume(); | ||
| }; | }; | ||
| + | </ | ||
| - | Cuboid:: | + | <code cpp Cuboid.cpp> |
| - | Cuboid:: | + | #include " |
| + | |||
| + | Cuboid:: | ||
| + | | ||
| + | rect.setHeight(h); | ||
| + | length = l; | ||
| + | } | ||
| + | |||
| + | Cuboid:: | ||
| + | rect = r; | ||
| + | | ||
| + | } | ||
| + | |||
| + | void Cuboid:: | ||
| + | Rectangle Cuboid:: | ||
| + | void Cuboid:: | ||
| + | int Cuboid:: | ||
| int Cuboid:: | int Cuboid:: | ||
| return length * rect.getWidth() * rect.getHeight(); | return length * rect.getWidth() * rect.getHeight(); | ||
| } | } | ||
| + | </ | ||
| - | int main () { | + | Οι παραπάνω δύο κατασκευαστές με χρήση member initilization list μπορούν να γραφούν ως εξής: |
| - | //Rectangle rect(5, | + | |
| - | | + | Παρατηρήστε πως ορίζονται οι κατασκευαστές της κλάσης |
| - | Cuboid | + | < |
| - | cout << " | + | Cuboid::Cuboid(Rectangle r, int l) : rect(r), length(l) { } |
| - | return 0; | + | Cuboid::Cuboid(int w, int h, int l) : rect(w,h), length(l) { } |
| - | } | + | |
| </ | </ | ||
| + | |||
| + | Στην 1η περίπτωση γίνεται ανάθεση του αντικειμένου //r// στο πεδίο //rect//. Στην 2η περίπτωση καλείται ο κατασκευαστής της κλάσης // | ||
| ===== Καταστροφέας της κλάσης ===== | ===== Καταστροφέας της κλάσης ===== | ||
| Line 176: | Line 254: | ||
| Στο παρακάτω παράδειγμα βλέπετε την κλάση // | Στο παρακάτω παράδειγμα βλέπετε την κλάση // | ||
| - | < | + | < |
| #include < | #include < | ||
| #include < | #include < | ||
| Line 201: | Line 279: | ||
| } | } | ||
| *width = w; *height = h; | *width = w; *height = h; | ||
| + | cout << " | ||
| } | } | ||
| Rectangle:: | Rectangle:: | ||
| + | cout << " | ||
| delete width; | delete width; | ||
| delete height; | delete height; | ||
| Line 220: | Line 300: | ||
| </ | </ | ||
| - | ===== Δημιουργία Αντικειμένων ===== | ||
| - | |||
| - | Η δημιουργία αντικειμένων γίνεται με κλήση του αντίστοιχου κατασκευαστή ως εξής: | ||
| - | <code c++> | ||
| - | Rectangle rect1(3,4); | ||
| - | Rectangle rect2(5); | ||
| - | Rectangle rect3; | ||
| - | </ | ||
| - | |||
| - | Ο παραπάνω κώδικας δημιουργεί 3 αντικείμενα της κλάσης // | ||
| - | |||
| - | <WRAP center round tip 80%> | ||
| - | Παρατηρήστε ότι για το τελευταίο αντικείμενο δεν χρησιμοποιούνται παρενθέσεις κατά την κλήση του καστασκευαστή, | ||
| - | <code c++> | ||
| - | Rectangle rect3(); // this is an error | ||
| - | </ | ||
| - | Η χρήση παρενθέσεων είναι λανθασμένη με συνέπεια να λάγετε μήνυμα λάθους από τον μεταγλωττιστή. | ||
| - | </ | ||