type conversions c
Δείτε τις διάφορες μετατροπές τύπου που υποστηρίζονται στο C ++.
Ελπίζουμε να γνωρίζετε όλους τους τύπους δεδομένων που διατίθενται στο C ++ από τα προηγούμενα σεμινάρια μας. Μερικές φορές, μπορεί να προκύψει μια ανάγκη που πρέπει να μετατρέψουμε έναν τύπο σε έναν άλλο. Αυτό ονομάζεται μετατροπή τύπου ή μετάδοση τύπου.
Σε αυτό το σεμινάριο, θα συζητήσουμε τις διάφορες μετατροπές τύπου που υποστηρίζονται στο C ++.
ερωτήσεις και απαντήσεις για συνέντευξη διακομιστή sql για έμπειρο pdf
=> Κάντε κλικ εδώ για το δωρεάν μάθημα C ++.
Τι θα μάθετε:
Τύπος Μετατροπές
Το C ++ υποστηρίζει δύο τύπους μετατροπών τύπου:
- Σιωπηρή μετατροπή τύπου: Η σιωπηρή μετατροπή τύπου είναι αυτόματη. Δεν υπάρχει παρέμβαση από τον χρήστη σε αυτόν τον τύπο μετατροπής και ο μεταγλωττιστής πραγματοποιεί απευθείας τη μετατροπή. Η μετατροπή γίνεται συνήθως όταν στην έκφραση υπάρχουν περισσότεροι από ένας τύποι δεδομένων. Αλλά γενικά, σε αυτόν τον τύπο μετατροπής, υπάρχει πιθανότητα απώλειας δεδομένων, απώλειας σημείων ή υπερχείλισης δεδομένων.
- Μετατροπή ρητού τύπου: Η ρητή μετατροπή τύπου ορίζεται από το χρήστη και συνήθως ονομάζεται 'τύπος μετάδοσης'. Εδώ ο χρήστης μεταδίδει ή μετατρέπει μια τιμή ενός τύπου δεδομένων σε έναν άλλο ανάλογα με τις απαιτήσεις. Αυτοί οι τύποι μετατροπών είναι ασφαλέστεροι.
Τώρα θα δούμε και τους δύο τύπους μετατροπής τύπου λεπτομερώς.
Σιωπηρή μετατροπή
Σε σιωπηρή μετατροπή, ο μεταγλωττιστής πραγματοποιεί τις μετατροπές από έναν τύπο δεδομένων σε έναν άλλο όταν μια παράσταση έχει περισσότερους από έναν τύπους δεδομένων. Προκειμένου να αποφευχθεί η απώλεια δεδομένων, όλες οι μεταβλητές των άλλων τύπων δεδομένων μετατρέπονται στον μεγαλύτερο τύπο δεδομένων. Αυτό ονομάζεται προώθηση.
Ας κατανοήσουμε την έμμεση μετατροπή χρησιμοποιώντας ένα παράδειγμα κώδικα.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Παραγωγή:
10 + «Α» = 75
float val (10 + ‘a’) = 107
var_int = 1000
Το παραπάνω παράδειγμα κώδικα δείχνει σιωπηρή μετατροπή. Έχουμε δηλώσει έναν ακέραιο και μια μεταβλητή χαρακτήρων με τιμές 10 και «A» αντίστοιχα. Όταν προσθέτουμε αυτές τις δύο μεταβλητές, πραγματοποιείται μια σιωπηρή μετατροπή.
Καθώς ο ακέραιος είναι ο μεγαλύτερος τύπος σε αυτήν την έκφραση, η τιμή μεταβλητής χαρακτήρα «Α» μετατρέπεται στο ακέραιο ισοδύναμό της, δηλαδή τιμή 65 (τιμή ASCII). Έτσι το αποτέλεσμα της έκφρασης είναι 75.
Στην επόμενη έκφραση, προσθέτουμε ακέραιο και χαρακτήρα (‘a’ -> 97) και μετά αποδίδουμε το αποτέλεσμα στο float. Έτσι το αποτέλεσμα της έκφρασης μετατρέπεται σιωπηρά σε float από τον μεταγλωττιστή.
Στην τρίτη έκφραση, μια σύντομη μεταβλητή int μετατρέπεται σε ακέραιο.
Σημείωση : Σε περίπτωση σιωπηρών μετατροπών, εάν ο μεταγλωττιστής εντοπίσει πιθανή απώλεια δεδομένων, τότε ενδέχεται να προειδοποιήσει σχετικά.
Άμεση μετατροπή
Η ρητή μετατροπή είναι επίσης γνωστή ως 'τύπος μετάδοσης' καθώς 'μεταδίδουμε' έναν τύπο δεδομένων σε έναν άλλο τύπο δεδομένων. Εδώ, οι χρήστες ορίζουν ρητά τη μετάδοση, σε αντίθεση με την σιωπηρή μετατροπή όπου ο μεταγλωττιστής πραγματοποιεί εσωτερικά τη μετατροπή.
Μπορούμε να πραγματοποιήσουμε τη ρητή μετατροπή με δύο τρόπους:
# 1) Χρήση χειριστή ανάθεσης
Η ρητή μετατροπή ή η πληκτρολόγηση χρησιμοποιώντας τον χειριστή ανάθεσης με έναν τρόπο εκτελείται δυναμικά. Εδώ ρίχνουμε ή μετατρέπουμε έναν τύπο δεδομένων σε έναν άλλο τύπο δεδομένων χρησιμοποιώντας τον χειριστή ανάθεσης.
Η γενική σύνταξη είναι:
(data type) expression;
Το ακόλουθο παράδειγμα εξηγεί αυτό:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Παραγωγή:
Άθροισμα = 5563
Comp = 5563.2
Έχουμε δείξει ρητή μετάδοση χρησιμοποιώντας τον τελεστή ανάθεσης στο παραπάνω παράδειγμα. Πρώτα, ρίχνουμε τον μεταβλητό μισθό του τύπου διπλό σε ακέραιο τύπο. Στη συνέχεια, ρίχνουμε το ακεραίο μεταβλητό άθροισμα σε διπλό τύπο.
Όπως φαίνεται στην έξοδο, ο τύπος στον οποίο μεταδίδουμε δείχνει τον τελικό τύπο του αποτελέσματος της έκφρασης.
Αυτό είναι πλεονεκτικό καθώς ο χρήστης μπορεί να αλλάξει τον τύπο έκφρασης σύμφωνα με τις απαιτήσεις.
# 2) Χρήση Cast Operator
Σε αυτόν τον τύπο μετάδοσης, χρησιμοποιούμε έναν «χειριστή χύτευσης» που είναι ένας απλός χειριστής για να αλλάξουμε από τον έναν τύπο στον άλλο.
Τύποι χύτευσης
Έχουμε τους ακόλουθους τύπους μετάδοσης ανάλογα με τον χειριστή που χρησιμοποιούμε:
# 1) Στατικό καστ
Το στατικό cast είναι το απλούστερο μεταξύ όλων των δακτυλογράφησης χρησιμοποιώντας τον χειριστή του cast . Το στατικό cast είναι σε θέση να εκτελέσει όλες τις μετατροπές που πραγματοποιούνται σιωπηρά. Εκτελεί επίσης μετατροπές μεταξύ δεικτών τάξεων που σχετίζονται μεταξύ τους (upcast -> από παράγωγα σε βάση ή από κάτω -> από βάση σε παράγωγα).
Εκτός από τις παραπάνω αναφερόμενες μετατροπές, το στατικό cast μπορεί επίσης να μετατρέψει οποιοδήποτε δείκτη σε άκυρο *.
Το στατικό καστ είναι το μεταγλωττισμένο χρονικό όριο. Αυτό σημαίνει ότι δεν υπάρχει έλεγχος κατά το χρόνο εκτέλεσης για να διαπιστωθεί εάν το cast που εκτελέστηκε είναι έγκυρο ή όχι. Συνεπώς, παραμένει η ευθύνη του προγραμματιστή να διασφαλίσει ότι η μετατροπή ήταν ασφαλής και έγκυρη.
Με άλλα λόγια, ο χρήστης πρέπει να διασφαλίσει ότι το αντικείμενο που μετατράπηκε ήταν πλήρες σε σχέση με τον τύπο δεδομένων προορισμού.
Καθορίζουμε ένα στατικό cast ως εξής:
static_cast (expression)
Ας κατανοήσουμε το στατικό cast χρησιμοποιώντας ένα παράδειγμα.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<Στο παραπάνω παράδειγμα, έχουμε τροποποιήσει ελαφρώς τον κώδικα για να συμπεριλάβουμε μια μεταβλητή χαρακτήρων με την τιμή 'A'. Στη συνέχεια δηλώνουμε έναν ακέραιο δείκτη και εφαρμόζουμε ένα στατικό cast για να μετατρέψουμε έναν χαρακτήρα σε ακέραιο δείκτη.
Όταν καταρτίζουμε αυτό το πρόγραμμα λαμβάνουμε την ακόλουθη έξοδο.
Στη συνάρτηση «int main ()»:
10:35: σφάλμα: μη έγκυρο static_cast από τον τύπο «char *» στον τύπο «int *»
Το πρόγραμμα δίνει ένα σφάλμα για το στατικό cast που εκτελείται καθώς δεν είναι έγκυρο. Έτσι, το στατικό cast επιτρέπει μόνο έγκυρη μετάδοση τύπου ή μετατροπές και δίνει σφάλμα όταν προσπαθούμε να πραγματοποιήσουμε κάποια ανεπιθύμητη πληκτρολόγηση.
# 2) Δυναμικό Cast
Το Dynamic cast είναι ένα cast εκτέλεσης που εκτελείται για τον έλεγχο της εγκυρότητας του cast. Το δυναμικό cast εκτελείται μόνο σε δείκτες κλάσης και αναφορές. Η έκφραση επιστρέφει μια τιμή NULL εάν το cast αποτύχει.
Το δυναμικό καστ χρησιμοποιεί έναν μηχανισμό γνωστό ως RTTI (Αναγνώριση τύπου χρόνου εκτέλεσης) . Το RTTI καθιστά όλες τις πληροφορίες σχετικά με τον τύπο δεδομένων του αντικειμένου διαθέσιμες κατά το χρόνο εκτέλεσης και διατίθεται μόνο για τις τάξεις που έχουν τουλάχιστον μία εικονική λειτουργία (πολυμορφικός τύπος). Το RTTI επιτρέπει τον προσδιορισμό του τύπου αντικειμένου κατά το χρόνο εκτέλεσης ή κατά τον χρόνο εκτέλεσης.
Ας δοκιμάσουμε ένα παράδειγμα για να κατανοήσουμε το δυναμικό cast.
πώς να ξεκινήσετε ένα αρχείο .jar
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
Σε αυτό το πρόγραμμα, έχουμε ορίσει δύο κατηγορίες, βάση με εικονική συνάρτηση και παράγωγο με βασική κλάση, βάση.
Στην κύρια συνάρτηση, δημιουργούμε ένα παράγωγο αντικείμενο κλάσης που επισημαίνεται από το δείκτη κλάσης βάσης. Στη συνέχεια, εκτελούμε το dynamic_cast στο βασικό δείκτη δείχνοντας σε μια παράγωγη κλάση για να το μεταδώσουμε σε ένα δείκτη κλάσης.
Όπως και στην κατηγορία βάσης, η βάση είναι πολυμορφική (περιέχει εικονική λειτουργία), το dynamic_cast είναι επιτυχές.
Σημείωση: Εάν καταργήσουμε την εικονική λειτουργία από την παραπάνω κλάση, τότε το dynamic_cast θα αποτύχει καθώς οι πληροφορίες RTTI για τα αντικείμενα δεν θα είναι διαθέσιμες.
Το δυναμικό καστ έχει γενικά ασφάλεια τύπου κατά το χρόνο εκτέλεσης.
# 3) Επανερμηνεία Cast
Αυτός ο τύπος cast είναι πιο επικίνδυνος στη χρήση καθώς λειτουργεί σε οποιοδήποτε είδος αντικειμένου χωρίς οι τάξεις να σχετίζονται μεταξύ τους.
Το Reintepret_cast λειτουργεί σε οποιονδήποτε δείκτη και μετατρέπει έναν δείκτη οποιουδήποτε τύπου σε οποιονδήποτε άλλο τύπο, ανεξάρτητα από το αν οι δείκτες σχετίζονται μεταξύ τους ή όχι. Δεν ελέγχει εάν ο δείκτης ή τα δεδομένα που επισημαίνονται από τον δείκτη είναι ίδια ή όχι.
Ο τελεστής μετάδοσης λαμβάνει μόνο μία παράμετρο, τον δείκτη προέλευσης για μετατροπή και δεν επιστρέφει καμία τιμή. Απλώς μετατρέπει τον τύπο του δείκτη.
Δεν πρέπει να χρησιμοποιούμε εκτός εάν απαιτείται. Συνήθως πληκτρολογούμε τον δείκτη πηγής στον αρχικό του τύπο.
Χρησιμοποιούμε κυρίως για να δουλεύουμε με bits. Όταν χρησιμοποιείται σε τιμές Boolean, οι τιμές boolean μετατρέπονται σε ακέραιες τιμές, δηλαδή 1 για true και 0 για false.
Ας δούμε ένα παράδειγμα του Reinterpret cast:
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
Παραγωγή:
0x3ef3090
προς την
97
προς την
Στο παραπάνω παράδειγμα, έχουμε δηλώσει έναν ακέραιο δείκτη ptr που δείχνει την τιμή 97. Στη συνέχεια, δηλώνουμε έναν χαρακτήρα δείκτη ch και ρίχνουμε το ptr σε αυτόν χρησιμοποιώντας.
Στη συνέχεια, εκτυπώνουμε διάφορες τιμές. Το πρώτο που εκτυπώνουμε είναι το ptr που δείχνει μια ακέραια θέση. Ως εκ τούτου εκτυπώνει μια διεύθυνση.
Η επόμενη τιμή ch περιέχει την τιμή 97 και έτσι εκτυπώνει το «a» που ισοδυναμεί με το ASCII του 97. Η επόμενη τιμή «* ptr» κρατά την τιμή 97 ενώ το «* ch» κρατά το ισοδύναμο ASCII του 97 δηλαδή «a» καθώς ρίχνει χρησιμοποιώντας το reinterpret_cast.
# 4) Const Cast
Ο τελεστής χύτευσης χρησιμοποιείται για να αλλάξει ή να χειριστεί τη σταθερότητα του δείκτη πηγής. Με χειραγώγηση, εννοούμε ότι μπορεί να είναι είτε να ρυθμίσετε τη σταθερότητα σε έναν δείκτη non-const είτε να αφαιρέσετε τη σταθερότητα από έναν δείκτη const.
Η προϋπόθεση για την επιτυχημένη μετάδοση του χειριστή είναι ότι ο δείκτης και η πηγή που μεταδίδεται πρέπει να είναι του ίδιου τύπου.
Ας πάρουμε ένα παράδειγμα για να το κατανοήσουμε αυτό.
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
Σε αυτό το παράδειγμα, βλέπουμε ότι η συνάρτηση «printVal» δέχεται δείκτη χωρίς σταθερά. Στην κύρια συνάρτηση, έχουμε μια μεταβλητή const «τιμή» που αντιστοιχεί στο const pointer ptr.
Για να περάσουμε αυτόν τον δείκτη const στη συνάρτηση printVal, το ρίχνουμε εφαρμόζοντας για να αφαιρέσουμε τη σταθερότητα. Στη συνέχεια, περνάμε το δείκτη ptr_cast στη συνάρτηση για να λάβουμε τα επιθυμητά αποτελέσματα.
συμπέρασμα
Με αυτό, θα ολοκληρώσουμε αυτό το θέμα της μετατροπής τύπου στο C ++. Έχουμε δει όλα σχετικά με τις σιωπηρές και ρητές μετατροπές που χρησιμοποιούνται στο C ++.
Ωστόσο, θα πρέπει να γνωρίζετε ότι για να αποφευχθεί η απώλεια δεδομένων και άλλες τέτοιες δυσκολίες, οι μετατροπές ή η πληκτρολόγηση θα πρέπει να εφαρμόζονται με σύνεση μόνο εάν η κατάσταση απαιτεί τη χρήση.
=> Δείτε τον οδηγό εκπαίδευσης για αρχάριους C ++ εδώ.
Συνιστώμενη ανάγνωση
- Καλύτερη δωρεάν σειρά C # Tutorial: Ο απόλυτος οδηγός C # για αρχάριους
- Πληκτρολογήστε Προκριματικά και Μαθήματα αποθήκευσης σε C ++
- Τύποι δοκιμών μετεγκατάστασης: Με σενάρια δοκιμής για κάθε τύπο
- Πώς να αποφασίσετε ποιος τύπος δοκιμών απαιτείται για ένα έργο; - Εγχειρίδιο ή αυτοματισμός
- Τύποι δεδομένων C ++
- Φόρτωση δοκιμής με HP LoadRunner Tutorials
- Μεταβλητές σε C ++
- Πρότυπα σε C ++ με παραδείγματα