Τι σημαίνει το "const" στο τέλος της δήλωσης συνάρτησης;

Πήρα ένα βιβλίο, όπου είναι γραμμένο κάτι τέτοιο:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

Τι σημαίνει αυτό;

Λύση

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

Ένας άλλος τρόπος να σκεφτούμε για μια τέτοια "const συνάρτηση" είναι να θεωρήσουμε μια συνάρτηση κλάσης ως μια κανονική συνάρτηση που παίρνει έναν έμμεσο δείκτη this. Έτσι, μια μέθοδος int Foo::Bar(int random_arg) (χωρίς το const στο τέλος) οδηγεί σε μια συνάρτηση όπως int Foo_Bar(Foo* this, int random_arg), και μια κλήση όπως Foo f; f.Bar(4) θα αντιστοιχεί εσωτερικά σε κάτι σαν Foo f; Foo_Bar(&f, 4). Τώρα, η προσθήκη της const στο τέλος (int Foo::Bar(int random_arg) const) μπορεί στη συνέχεια να εκληφθεί ως δήλωση με δείκτη const this: int Foo_Bar(const Foo* this, int random_arg). Δεδομένου ότι ο τύπος του this σε μια τέτοια περίπτωση είναι const, δεν είναι δυνατή καμία τροποποίηση των μεταβλητών μελών.

Είναι δυνατόν να χαλαρώσετε τον περιορισμό "const function" που δεν επιτρέπει στη συνάρτηση να γράφει σε οποιαδήποτε μεταβλητή μιας κλάσης. Για να επιτραπεί σε ορισμένες από τις μεταβλητές να είναι δυνατή η εγγραφή ακόμη και όταν η συνάρτηση χαρακτηρίζεται ως "const function", αυτές οι μεταβλητές της κλάσης χαρακτηρίζονται με τη λέξη κλειδί mutable. Έτσι, αν μια μεταβλητή κλάσης είναι χαρακτηρισμένη ως μεταβλητή και μια "const συνάρτηση" γράφει σε αυτή τη μεταβλητή, τότε ο κώδικας θα μεταγλωττιστεί καθαρά και η μεταβλητή είναι δυνατόν να αλλάξει. (C++11)

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

Το const είναι ένα εξαιρετικά υπερχρησιμοποιημένο προσδιοριστικό στη C++: η σύνταξη και η διάταξη δεν είναι συχνά απλή σε συνδυασμό με δείκτες. Μερικά αναγνώσματα σχετικά με την ορθότητα του const και τη λέξη-κλειδί const:

Const correctness

The C++ 'const' Declaration: Why & How

Σχόλια (6)

Το Bar εγγυάται ότι δεν θα αλλάξει το αντικείμενο στο οποίο καλείται. Δείτε για παράδειγμα την ενότητα σχετικά με την ορθότητα της const στις Συχνές Ερωτήσεις της C++.

Σχόλια (1)

Παρόμοια με την αυτή ερώτηση.

Στην ουσία σημαίνει ότι η μέθοδος Bar δεν θα τροποποιήσει τις μη μεταβλητές μεταβλητές-μέλη της Foo.

Σχόλια (0)