cpp:constructors_destructors
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:constructors_destructors [2017/04/20 08:11] – gthanos | cpp:constructors_destructors [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
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 |
- | < | + | <code cpp Rectangle.hpp> |
#include < | #include < | ||
+ | #include < | ||
+ | #include < | ||
using namespace std; | using namespace std; | ||
- | #include " | + | 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, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | O ίδιος κώδικας με χρήση // | ||
+ | |||
+ | <code cpp> | ||
+ | Rectangle:: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Αρχικοποίηση αντικειμένων που περιέχουν πεδία που περιγράφονται από κλάσεις ===== | ||
+ | |||
+ | Στην προηγούμενη ενότητα είδαμε την κλάση Cuboid που περιγράφει την κλάση του κυβοειδούς και περιέχει ένα πεδίο τύπου Rectangle. Εδώ θα δούμε πως μπορούμε να ορίσουμε ένα ή περισσότερους κατασκευαστές για τη συγκεκριμένη κλάση. | ||
+ | |||
+ | <code cpp Cuboid.hpp> | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | #include " | ||
class Cuboid { | class Cuboid { | ||
Line 137: | 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.hpp" |
- | int Cuboid::volume() { | + | Cuboid::Cuboid(int w, int h, int l) { |
- | | + | rect.setWidth(w); |
+ | | ||
+ | length = l; | ||
} | } | ||
- | int main () { | + | Cuboid:: |
- | | + | |
- | Cuboid | + | |
- | cout << " | + | } |
- | Cuboid | + | |
- | cout << " | + | void Cuboid:: |
- | return | + | Rectangle |
+ | void Cuboid::setLength(int l) { length = l; } | ||
+ | int Cuboid::getLength() const { return length; } | ||
+ | |||
+ | int Cuboid:: | ||
+ | return | ||
} | } | ||
</ | </ | ||
- | Παρατηρήστε | + | Οι παραπάνω δύο κατασκευαστές με χρήση member |
< | < | ||
Cuboid:: | Cuboid:: | ||
Line 169: | Line 245: | ||
</ | </ | ||
- | Στην 1η περίπτωση γίνεται ανάθεση του αντικειμένου //r// στο πεδίο //rect//. Στην 2η περίπτωση καλείται ο κατασκευαστής της κλάσης // | + | Στην 1η περίπτωση γίνεται ανάθεση του αντικειμένου //r// στο πεδίο //rect//. Στην 2η περίπτωση καλείται ο κατασκευαστής της κλάσης // |
+ | |||
+ | Η ανάθεση '' | ||
===== Καταστροφέας της κλάσης ===== | ===== Καταστροφέας της κλάσης ===== | ||
Line 176: | Line 255: | ||
Στο παρακάτω παράδειγμα βλέπετε την κλάση // | Στο παρακάτω παράδειγμα βλέπετε την κλάση // | ||
- | < | + | < |
#include < | #include < | ||
#include < | #include < | ||
Line 201: | Line 280: | ||
} | } | ||
*width = w; *height = h; | *width = w; *height = h; | ||
+ | cout << " | ||
} | } | ||
Rectangle:: | Rectangle:: | ||
+ | cout << " | ||
delete width; | delete width; | ||
delete height; | delete height; |
cpp/constructors_destructors.1492675867.txt.gz · Last modified: 2017/04/20 07:11 (external edit)