Βίντεο: Λόγος Τιμής - Νιώθω Έντονα 2025
Ο προγραμματισμός αφορά μόνο την ευκρίνεια. Είναι δύσκολο (στην πραγματικότητα είναι αδύνατο) να γράφετε και να διατηρείτε ένα πρόγραμμα που δεν μπορείτε να διαβάσετε. Μέρος της ανάγνωσης μιας καταχώρησης κώδικα πηγής κατανοεί τι αντιπροσωπεύουν οι αριθμοί που χρησιμοποιούνται στο πρόγραμμα. Η πιο βασική βοήθεια που παρέχει η C ++ είναι η πανταχού παρούσα #define, όπως στο παρακάτω παράδειγμα:
#define PI 3. 141592653589793
Αυτή η λύση είναι εντάξει για μεμονωμένες τιμές, αν και πάσχει από το γεγονός ότι Ο μηχανισμός #define δεν είναι (αυστηρά) ένα μέρος του C / C ++, αφού ο προεπεξεργαστής τρέχει πριν από τον μεταγλωττιστή. Σε απάντηση, η C ++ 2011 εισήγαγε μια σταθερή έκφραση construct:
constexpr μακρύ διπλό PI = 3. 141592653589793;
Η λέξη-κλειδί constexpr φέρει σταθερές στη σκηνή C ++. Αυτό το PI έχει έναν πραγματικό τύπο, όπως και άλλες μεταβλητές C ++. Το C ++ μπορεί να δημιουργήσει μηνύματα σφάλματος με PI που έχουν πολύ μεγαλύτερη αίσθηση από αυτά που αφορούν το 3. 14159.
Οι σταθερές εκφράσεις είναι ωραία για μεμονωμένες σταθερές τιμές, αλλά συχνά οι σταθερές αντιπροσωπεύουν σύνολα πραγμάτων αντί για φυσικές σταθερές, όπως στο παρακάτω παράδειγμα:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ΑΡΚΑΝΣΑΣ 3 // … και ούτω καθεξής …
Πιθανώς αυτές οι σταθερές χρησιμοποιούνται για τον εντοπισμό των καταστάσεων, ίσως να χρησιμοποιηθούν ως ένα δείκτη σε μια σειρά αντικειμένων κατάστασης ή ως τιμή σε μια βάση δεδομένων κάπου.
Η C ++ έχει από καιρό έναν βελτιωμένο μηχανισμό για τον καθορισμό αυτών των τύπων σταθερών - η απαρίθμηση:
enum STATE {DC_OR_TERRITORY, // παίρνει 0 ALABAMA, // παίρνει 1 ALASKA, // παίρνει 2 ARKANSAS, // … και σύντομα…};
Η λέξη-κλειδί enum εισάγει μια ακολουθία σταθερών που ονομάζεται "απαρίθμηση". Στην περίπτωση αυτή, η απαρίθμηση φέρει το όνομα STATE. Κάθε στοιχείο αυτής της απαρίθμησης έχει εκχωρηθεί μια τιμή ξεκινώντας από 0 και αυξάνοντας διαδοχικά κατά 1, έτσι DC_OR_TERRITORY ορίζεται ως 0, ALABAMA ορίζεται ως 1, και ούτω καθεξής. Μπορείτε να παρακάμψετε αυτήν την αυξητική αλληλουχία χρησιμοποιώντας μια εντολή assign ως εξής:
enum STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … και ούτω καθεξής …};
Αυτή η έκδοση του STATE ορίζει ένα στοιχείο DC, το οποίο δίνεται στην τιμή 0. Στη συνέχεια ορίζει ένα νέο στοιχείο TERRITORY, το οποίο έχει επίσης την τιμή 0. Η ALABAMA συλλαμβάνει με 1, όπως και πριν.
Στην πράξη, ο προγραμματιστής μπορεί να χρησιμοποιήσει απαριθμήσεις για να γράψει έναν αρκετά ευανάγνωστο κώδικα όπως παρακάτω:
double taxRate (STATE s) {return taxRatesByState [s];}
Το μόνο πρόβλημα με αυτήν την προσέγγιση είναι ότι αυτή η απαρίθμηση δεν δημιουργεί νέο τύπο (όπως ίσως νομίζετε).Στην πραγματικότητα, σύμφωνα με το πρότυπο, το STATE είναι απλά ένα άλλο όνομα για int - και οι σταθερές ALABAMA, ALASKA, και ούτω καθεξής είναι όλοι τύπου const int.
Ο μεταγλωττιστής gcc στην πραγματικότητα παρέχει ένα enum που δηλώνει με αυτόν τον τρόπο λίγο περισσότερη εξουσία απ 'ότι απλά ονομάζει μια άλλη μορφή int. Μπορείτε πραγματικά να υπερφορτώσετε τις λειτουργίες βάσει ενός τύπου enum:
void fn (STATE s); άκυρη fn (int n)? fn (ALASKA). // invokes fn (STATE)
Το πρότυπο 2011 επιτρέπει στον προγραμματιστή να δημιουργήσει έναν εντελώς νέο τύπο χρησιμοποιώντας τη λέξη enum. Δεδομένου ότι οι δημιουργοί του νέου προτύπου δεν θέλουν να σπάσουν τον υπάρχοντα κώδικα, το πρότυπο απαιτεί την προσθήκη μιας επιπλέον λέξης-κλειδιού για τον ορισμό ενός τύπου απαρίθμησης, όπως στο παρακάτω παράδειγμα:
enum class STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … και ούτω καθεξής …};
Μια τάξη απαρίθμησης είναι τώρα πλήρης τύπου όπως κάθε άλλη κλάση που ορίζει ο χρήστης. Τα παρακάτω δεν είναι ακόμη νόμιμα για δύο λόγους:
int s = ALASKA;
Κατ 'αρχάς, η σταθερή ALASKA ορίζεται μόνο μέσα στο χώρο ονομάτων STATE. Έτσι, το όνομα της σταθεράς είναι ΚΡΑΤΙΚΟ: ΑΛΑΣΚΑ. Δεύτερον, ο τύπος δεν είναι int αλλά STATUS. Δεν μπορείτε να αντιστοιχίσετε μια τιμή τύπου STATE σε ένα int.
ΚΡΑΤΟΣ s = ΚΡΑΤΟΣ:: ALASKA;
Ο προγραμματιστής μπορεί να αναδιατυπώσει ένα STATE σε ένα int, αλλά πρέπει να το κάνει ρητά -αυτές οι μετατροπές δεν το κόβουν με τάξεις απαρίθμησης:
int n = (int) STATE:: ALASKA;
Αυτός ο νέος τύπος enum μπορεί επίσης να βασιστεί σε έναν από τους άλλους τύπους αριθμών μέτρησης εκτός από το int:
enum class STATE: char {DC, // … το υπόλοιπο της δήλωσης είναι ίδιο
