Sobes.tech
Junior

Τι γνωρίζετε για τις στατικές και μη στατικές μεθόδους;

sobes.tech AI

Απάντηση από AI

Οι σταθερές μέθοδοι (const methods) σε C++ είναι μέθοδοι κλάσης που δηλώνονται με τη λέξη-κλειδί const μετά από τη λίστα παραμέτρων.

class MyClass {
public:
    void nonConstMethod();         // Μη σταθερή μέθοδος
    void constMethod() const;      // Σταθερή μέθοδος
};

Η λέξη-κλειδί const μετά από τη λίστα παραμέτρων εγγυάται ότι η μέθοδος δεν θα αλλάξει την κατάσταση του αντικειμένου στο οποίο καλείται. Αυτό σημαίνει ότι μέσα σε μια σταθερή μέθοδο:

  • Δεν μπορούν να τροποποιηθούν τα μη στατικά μέλη δεδομένων του αντικειμένου.
  • Μπορούν να καλούνται μόνο άλλες σταθερές μεθόδοι του ίδιου αντικειμένου.

Σκοπός των σταθερών μεθόδων:

  1. Ασφάλεια: Προλαμβάνουν τυχαίες αλλαγές στην κατάσταση του αντικειμένου.
  2. Χρήση με σταθερά αντικείμενα: Τα σταθερά αντικείμενα (που δηλώνονται με const) μπορούν να καλούν μόνο σταθερές μεθόδους. Οι μη σταθερές μέθοδοι δεν είναι προσβάσιμες σε αυτά.
  3. Υπερφόρτωση: Οι μέθοδοι μπορούν να υπερφορτωθούν κατά constness. Αυτό επιτρέπει να υπάρχουν δύο μέθοδοι με το ίδιο όνομα και υπογραφή παραμέτρων, αλλά η μία θα είναι σταθερή και η άλλη όχι. Ο μεταγλωττιστής θα επιλέξει την κατάλληλη έκδοση ανάλογα με το αν καλείται σε σταθερό ή μη σταθερό αντικείμενο.
class MyClass {
    int value;
public:
    int getValue() const { // Σταθερή έκδοση
        return value;
    }
    int getValue() {       // Μη σταθερή έκδοση
        return value++;    // Δυνατότητα αλλαγής της κατάστασης
    }
};

void test(const MyClass& objConst, MyClass& objNonConst) {
    objConst.getValue();    // Κλήση στη σταθερή έκδοση
    objNonConst.getValue(); // Κλήση στη μη σταθερή έκδοση
}

Μη σταθερές μέθοδοι:

Αυτές είναι συνηθισμένες μέθοδοι της κλάσης που μπορούν να αλλάξουν την κατάσταση του αντικειμένου. Δηλώνονται χωρίς τη λέξη-κλειδί const μετά από τη λίστα παραμέτρων.

Χρήση:

Τύπος αντικειμένου Κλήση μεθόδου Ποια μέθοδος θα κληθεί Επεξήγηση
const T obj.method() Μόνο η σταθερή έκδοση Δεν μπορεί να αλλάξει την κατάσταση του σταθερού αντικειμένου.
T obj.method() Μη σταθερή μέθοδος Μπορεί να αλλάξει την κατάσταση.
T obj.method() const Σταθερή μέθοδος Αν και και οι δύο εκδόσεις υπάρχουν και καλούνται σε μη σταθερό αντικείμενο, προτεραιότητα έχει η μη σταθερή. Αλλά μπορεί να γίνει ρητά cast το αντικείμενο, αν θέλετε να καλέσετε τη σταθερή έκδοση (σπάνια).

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