User Tools

Site Tools


cpp:classes

This is an old revision of the document!


Κλάσεις και Αντικείμενα

Όπως και στη Java οι κλάσεις στη C++ δημιουργούν νέους τύπους δεδομένων. Παρακάτω δίνεται το παράδειγμα της κλάσης Rectangle με παράλληλη δημιουργία ενός αντικειμένου της κλάσης αυτής.

Rectangle.cpp
#include <iostream>
using namespace std;
 
class Rectangle {
  private:
    int width, height;
  public:
    void setWidth(int w);
    void setHeight(int h);
    int getWidth() const;
    int getHeight() const;
};
 
void Rectangle::setWidth(int w) { width = w; }
void Rectangle::setHeight(int h) { height = h; }
int Rectangle::getWidth() const { return width; }
int Rectangle::getHeight() const { return height; }
 
int main () {
  Rectangle rect;
  rect.setWidth(5);
  rect.setHeight(6);
  cout << "area: " << rect.getWidth() * rect.getHeight() << endl;
  return 0;
}

Η παραπάνω κλάση διαθέτει τα πεδία τύπου int width, height και τις μεθόδους setWidth, setHeight, getWidth, getHeight. Η κλάση δεν διαθέτει κατασκευαστή. Η δήλωση Rect rect; στη μέθοδο main() δημιουργεί ένα αντικείμενο με κλήση του default κατασκευαστή.

Διάκριση μεταξύ δήλωσης της κλάσης και υλοποίησης της κλάσης

Στο προηγούμενο παράδειγμα, η δήλωση της κλάσης και η υλοποίηση των μεθόδων (συναρτήσεων) της κλάσης βρίσκονται στο ίδιο αρχείο. Η δήλωση στο ίδιο αρχείο της κλάσης και των μεθόδων της δεν είναι συνήθης πρακτική. Αντ' αυτού, η δήλωση της κλάσης δηλώνεται σε ένα header file με το όνομα της κλάσης και κατάληξη .hpp ή .h, ενώ η υλοποίηση των μεθόδων σε ένα αρχείο .cpp με το ίδιο όνομα. Η κλάση Rectangle που αναφέρεται παραπάνω θα πρέπει να “σπάσει” σε δύο αρχεία ως εξής:

Rectangle.hpp
#include <iostream>
using namespace std;
 
class Rectangle {
  private:
    int width, height;
  public:
    void setWidth(int w);
    void setHeight(int h);
    int getWidth() const;
    int getHeight() const;
};
Rectangle.cpp
#include "Rectangle.hpp"
 
void Rectangle::setWidth(int w) { width = w; }
void Rectangle::setHeight(int h) { height = h; }
int Rectangle::getWidth() const { return width; }
int Rectangle::getHeight() const { return height; }

Ο λόγος που διακρίνουμε μία κλάση σε δήλωση και υλοποίηση είναι ότι η δήλωση της κλάσης μπορεί να χρειαστεί να γίνει include από περισσότερα του ενός αρχεία στο ίδιο πρόγραμμα. Η υλοποίηση όμως δεν θέλουμε να συμπεριληφθεί σε περισσότερα του ενός μεταγλωττισμένα αρχεία στο ίδιο πρόγραμμα, διότι ο linker θα διαμαρτύρεται ότι η ίδια συνάρτηση υπάρχει περισσότερες από μία φορές μέσα στο πρόγραμμα. Επιπλέον, δεν είναι καλή πρακτική στον αντικειμενοστραφή προγραμματισμό να αποκαλύπτουμε στον προγραμματιστή χρήστη της κλάσης της εσωτερική υλοποίηση της. Έτσι, μπορούμε να διατηρήσουμε “κρυφή” την υλοποίηση των μεθόδων σε ξεχωριστό αρχείο από τη δήλωση της κλάσης.

Οι μέθοδοι της κλάσης

Οι μέθοδοι της κλάσης είναι συναρτήσεις οι οποίες έχουν απευθείας πρόσβαση στα πεδία (μεταβλητές) της κλάσης. Οι μέθοδοι ορίζονται μέσα στην κλάση ή ορίζεται το πρότυπο τους μέσα στην κλάση και η υλοποίηση τους εκτός. Από το παρακάτω παράδειγμα παρατηρήστε τους δύο διαφορετικούς τρόπους ορισμού των μεθόδων setWidth και setHeight. H υλοποίηση της setHeight ορίζεται μέσα στη δήλωση της κλάσης, ενώ η υλοποιηση της setWidth έξω από την κλάση.

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; }

Οι δύο παραπάνω τρόποι ορισμού μίας μεθόδου της κλάσης είναι ισοδύναμοι με την διαφορά ότι η μέθοδος setHeight ορίζεται ως inline ακόμη και εάν η λέξη inline δεν αναφέρεται ρητά. Για τον ορισμό της μεθόδου setWidth εκτός της κλάσης είναι απαραίτητη η χρήση του ονόματος της κλάσης ακολουθούμενη από το scope operator (Rectangle::setWidth(int w)). Η χρήση του scope operator εξασφαλίζει ότι η μέθοδος ανήκει στην κλάση και δεν αποτελεί αυτόνομη μέθοδο του προγράμματος.

Οι μέθοδοι getWidth και getHeight έχουν το προσδιοριστή const αμέσως μετά τη δήλωση τους. Ο προσδιοριστής const αμέσως μετά τη δήλωση, δηλώνει ότι η συγκεκριμένη συνάρτηση δεν μεταβάλλει το αντικείμενο στο οποίο ανήκει.

cpp/classes.1586333911.txt.gz · Last modified: 2020/04/08 07:18 (external edit)