Πιθανό αντίγραφο: Σημασία του “const” last σε μια δήλωση μεθόδου της C++;
Πήρα ένα βιβλίο, όπου είναι γραμμένο κάτι τέτοιο:
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
:
Το Bar
εγγυάται ότι δεν θα αλλάξει το αντικείμενο στο οποίο καλείται. Δείτε για παράδειγμα την ενότητα σχετικά με την ορθότητα της const στις Συχνές Ερωτήσεις της C++.
Παρόμοια με την αυτή ερώτηση.
Στην ουσία σημαίνει ότι η μέθοδος Bar
δεν θα τροποποιήσει τις μη μεταβλητές μεταβλητές-μέλη της Foo
.