Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
cpp:classes [2017/04/12 07:34] – gthanos | cpp:classes [2017/05/09 12:30] – [Κλάσεις και Αντικείμενα] gthanos |
---|
====== Κλάσεις και Αντικείμενα ====== | ====== Κλάσεις και Αντικείμενα ====== |
| |
Όπως και στη Java οι κλάσεις στη C++ δημιουργούν νέους τύπους δεδομένων. Παρακάτω δίνεται ένα παράδειγμα δήλωσης της κλάσης //Rectangle// με παράλληλη δημιουργία ενός αντικειμένου της κλάσης αυτής. | Όπως και στη Java οι κλάσεις στη C++ δημιουργούν νέους τύπους δεδομένων. Παρακάτω δίνεται το παράδειγμα της κλάσης //Rectangle// με παράλληλη δημιουργία ενός αντικειμένου της κλάσης αυτής. |
| |
<code c++ Rectangle.cpp> | <code c++ Rectangle.cpp> |
int width, height; | int width, height; |
public: | public: |
void set_values (int,int); | void setWidth(int w); |
int area() {return width*height;} | void setHeight(int h); |
| int getWidth(); |
| int getHeight(); |
}; | }; |
| |
void Rectangle::set_values (int x, int y) { | void Rectangle::setWidth(int w) { width = w; } |
width = x; | void Rectangle::setHeight(int h) { height = h; } |
height = y; | int Rectangle::getWidth() { return width; } |
} | int Rectangle::getHeight() { return height; } |
| |
int main () { | int main () { |
Rectangle rect; | Rectangle rect; |
rect.set_values(3,4); | rect.setWidth(5); |
cout << "area: " << rect.area(); | rect.setHeight(6); |
| cout << "area: " << rect.getWidth() * rect.getHeight() << endl; |
return 0; | return 0; |
} | } |
</code> | </code> |
| |
Από τον παραπάνω κώδικα παρατηρούμε τα εξής: | Η παραπάνω κλάση διαθέτει τα πεδία τύπου //int width, height// και τις μεθόδους //setWidth, setHeight, getWidth, getHeight//. Η κλάση δεν διαθέτει κατασκευαστή. Η δήλωση ''Rect rect;'' στη μέθοδο //main()// δημιουργεί ένα αντικείμενο με κλήση του //default// κατασκευαστή. |
- Σε αναλογία με την Java οι κλάσεις περιέχουν πεδία και συναρτήσεις(μεθόδους). | |
- Οποιαδήποτε μέθοδος μπορεί να οριστεί ολόκληρη μέσα στη δήλωση της κλάσης ή να ορίσει μόνο το πρότυπο της μέσα στη δήλωση της κλάσης και η υλοποίηση της εκτός της κλάσης. Η υλοποίηση της μεθόδου εκτός της κλάσης γίνεται με χρήση του τελεστή ''::'' (//scope operator//). Δηλώνοντας την υλοποίηση της μεθόδου μέσα στην κλάση είναι ισοδύναμο με το να την δηλώσετε έξω από την κλάση ως //inline// μέθοδο. | ===== Οι μέθοδοι της κλάσης ===== |
- Μπορούμε να περιορίσουμε την προσβασιμότητα των πεδίων και των μεθόδων μίας κλάσης με χρήση [[cpp:acccess_modifiers|προσδιοριστών πρόσβασης]]. | |
- Τα πεδία και οι μέθοδοι ενός αντικειμένου είναι προσβάσιμα με χρήση του τελεστή ''.'' ως εξής: ''<αντικείμενο>.<πεδίο ή μέθοδος>'' (για παράδειγμα ''rect.set_values(3,4)''; | Οι μέθοδοι της κλάσης είναι συναρτήσεις οι οποίες έχουν απευθείας πρόσβαση στα πεδία (μεταβλητές) της κλάσης. Οι μέθοδοι ορίζονται μέσα στην κλάση ή ορίζεται το πρότυπο τους μέσα στην κλάση και η υλοποίηση τους εκτός. Από το παρακάτω παράδειγμα παρατηρήστε τους δύο διαφορετικούς τρόπους ορισμού των μεθόδων //setWidth// και //setHeight//. |
- Στην παραπάνω κλάση δεν ορίζεται κατασκευαστής. Η δήλωση ''Rect rect;'' ισοδυναμεί με την δημιουργία ενός αντικειμένου με χρήση του //default// κατασκευαστή. | |
| <code c++ Rectangle.cpp> |
| #include <iostream> |
| using namespace std; |
| |
| class Rectangle { |
| private: |
| int width, height; |
| public: |
| int getWidth() const; |
| int getHeight() const; |
| void setWidth(int w); |
| void setHeight(int h) { height = h; } |
| }; |
| |
| int Rectangle::getWidth() const { return width;} |
| int Rectangle::getHeight() const { return height;} |
| void Rectangle::setWidth(int w) { width = w; } |
| </code> |
| |
| Οι δύο παραπάνω τρόποι ορισμού μίας μεθόδου της κλάσης είναι ισοδύναμοι με την διαφορά ότι η μέθοδος //setHeight// ορίζεται ως //inline// ακόμη και εάν η λέξη //inline// δεν αναφέρεται ρητά. Για τον ορισμό της μεθόδου //setWidth// εκτός της κλάσης είναι απαραίτητη η χρήση του ονόματος της κλάσης ακολουθούμενη από το //scope operator// (''Rectangle::setWidth(int w)''). Η χρήση του //scope operator// εξασφαλίζει ότι η μέθοδος ανήκει στην κλάση και δεν αποτελεί αυτόνομη μέθοδο του προγράμματος. |
| |
| <WRAP center round important 80%> |
| Οι μέθοδοι //getWidth// και //getHeight// έχουν το προσδιοριστή **const** αμέσως μετά τη δήλωση τους. Ο προσδιοριστής //const// αμέσως μετά τη δήλωση, δηλώνει ότι η συγκεκριμένη συνάρτηση **δεν μεταβάλλει το αντικείμενο στο οποίο ανήκει**. |
| |
| Η δήλωση //const// είναι εξαιρετικά σημαντική όταν θέλουμε να χρησιμοποιήσουμε τη συνάρτηση μέσα σε άλλες συναρτήσεις που είτε **α)** ανήκουν στην ίδια κλάση και δεν μεταβάλλουν το αντικείμενο στο οποίο εφαρμόζονται ή **β)** λαμβάνουν ως όρισμα ένα αντικείμενο της κλάσης το οποίο δεν μεταβάλλεται μέσα στο σώμα τους (λαμβάνουν ως παράμετρο μία αναφορά ή ένα δείκτη σε ένα αντικείμενο τύπου //const//). |
| </WRAP> |
| |