Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
cpp:constructors [2020/04/08 10:35] – gthanos | cpp:constructors [2020/04/14 07:36] – gthanos |
---|
====== Κατασκευαστές της κλάσης ====== | ====== Κατασκευαστές της κλάσης ====== |
| |
Στο προηγούμενο παράδειγμα της κλάσης //Rectangle// δεν δηλώθηκε κάποιος κατασκευαστής. Ο κατασκευαστής της κλάσης είναι μέθοδος που έχει το όνομα της κλάσης και δεν έχει επιστρεφόμενο τύπο. Ο ρόλος του κατασκευαστή της κλάσης είναι να αρχικοποιήσει τις τιμές των πεδίων της κλάσης. Σημειώστε, ότι ο κατασκευαστής της κλάσης στη C++ δεν δεσμεύει χώρο στη μνήμη, όπως συμβαίνει στη Java. Για την κλάση //Rectangle//, παρακάτω δηλώνεται ο κατασκευαστής ''Rectangle(int w, int h)''. | Στο προηγούμενο παράδειγμα της κλάσης //Rectangle// δεν δηλώθηκε κάποιος κατασκευαστής. Ο κατασκευαστής της κλάσης είναι συνάρτηση που έχει το όνομα της κλάσης και δεν έχει επιστρεφόμενο τύπο. Ο ρόλος του κατασκευαστή της κλάσης είναι να αρχικοποιήσει τις τιμές των πεδίων της κλάσης. Σημειώστε, ότι ο κατασκευαστής της κλάσης στη C++ δεν δεσμεύει χώρο στη μνήμη, όπως συμβαίνει στη Java. Για την κλάση //Rectangle//, παρακάτω δηλώνεται ο κατασκευαστής ''Rectangle(int w, int h)''. |
| |
<code cpp Rectangle.hpp> | <code cpp Rectangle.hpp> |
int getHeight() const; | int getHeight() const; |
}; | }; |
| </code> |
| |
| <code cpp Rectangle.cpp> |
| #include "Rectangle.hpp" |
| |
Rectangle::Rectangle(int w, int h) { | Rectangle::Rectangle(int w, int h) { |
width = w; height = h; | width = w; height = h; |
} | } |
| |
void Rectangle::setWidth(int w) { width = w; } | void Rectangle::setWidth(int w) { width = w; } |
void Rectangle::setHeight(int h) { height = h; } | void Rectangle::setHeight(int h) { height = h; } |
<WRAP center round info 80%> | <WRAP center round info 80%> |
Σε αναλογία με τις μεθόδους ο κατασκευαστής μπορεί να οριστεί εντός της κλάσης, όπως παρακάτω. Η δήλωση εντός της κλάσης συνεπάγεται τη δήλωση από τον προγραμματιστή του κατασκευαστή ως //inline//. | Σε αναλογία με τις μεθόδους ο κατασκευαστής μπορεί να οριστεί εντός της κλάσης, όπως παρακάτω. Η δήλωση εντός της κλάσης συνεπάγεται τη δήλωση από τον προγραμματιστή του κατασκευαστή ως //inline//. |
<code c++ Rectangle.cpp> | <code cpp Rectangle.cpp> |
class Rectangle { | class Rectangle { |
private: | private: |
| |
<code> | <code> |
Cuboid::Cuboid(Rectangle r, int l) : rect(r), length(l) { } | Cuboid::Cuboid(Rectangle r, int l) : rect(r), length(l) { } |
Cuboid::Cuboid(int w, int h, int l) : rect(w,h), length(l) { } | Cuboid::Cuboid(int w, int h, int l) : rect(w,h), length(l) { } |
</code> | </code> |
| |
Στην 1η περίπτωση γίνεται ανάθεση του αντικειμένου //r// στο πεδίο //rect//. Στην 2η περίπτωση καλείται ο κατασκευαστής της κλάσης //Rectangle// με ορίσματα //(w,h)//. | Στον πρώτο κατασκευαστή με τα δύο ορίσματα γίνεται ανάθεση του αντικειμένου //r// στο πεδίο //rect//, αντιγράφοντας την τιμή κάθε πεδίου της παραμέτρου //r// στο πεδίιο //rect//. Στον 2ο κατασκευαστή με τα τρία ορίσματα καλείται ο κατασκευαστής της κλάσης //Rectangle// με ορίσματα //(w,h)//. |
| |
Η ανάθεση ''rect = r;'' δεν είναι προφανής. Έχοντας δύο αντικείμενα τύπου Rectangle το ''rect'' και το ''r'', η εντολή ανάθεσης αντιγράφει τα περιεχόμενα του ''r'' στο ''rect'' πεδίο προς πεδίο. | |
| |
| |