Διαφορά μεταξύ της δομής και της Ένωσης
Περιεχόμενο
Το C ++ επιτρέπει όλους τους πέντε τρόπους με τους οποίους παρέχεται η γλώσσα C για τη δημιουργία προσαρμοσμένων δεδομένων. Αυτοί οι πέντε τρόποι είναι «δομή», «bit-field», «ένωση», «απαρίθμηση», «typedef». Στο παρακάτω άρθρο πρόκειται να μελετήσουμε τη διαφορά μεταξύ δομής και ένωσης. Η δομή και η ένωση είναι και οι δύο τύποι δεδομένων περιέκτη που μπορούν να διατηρούν δεδομένα οποιουδήποτε "τύπου". Η μία σημαντική διαφορά που διακρίνει τη δομή και την ένωση είναι ότι η δομή έχει ξεχωριστή θέση μνήμης για καθένα από τα μέλη της, ενώ τα μέλη μιας ένωσης μοιράζονται την ίδια θέση μνήμης.
Ας καταλάβουμε τη διαφορά μεταξύ της δομής και της ένωσης, μαζί με ένα διάγραμμα σύγκρισης.
- Συγκριτικό διάγραμμα
- Ορισμός
- Βασικές διαφορές
- Ομοιότητες
- συμπέρασμα
Συγκριτικό διάγραμμα
Βάση σύγκρισης | Δομή | Ενωση |
---|---|---|
Βασικός | Η χωριστή θέση μνήμης κατανέμεται σε κάθε μέλος της δομής. | Όλα τα μέλη της ένωσης μοιράζονται την ίδια θέση μνήμης. |
Δήλωση | struct struct_name { στοιχείο τύπου1; στοιχείο στοιχείου2. . . } μεταβλητή1, μεταβλητή2, ...; | ένωση u_name { στοιχείο τύπου1; στοιχείο στοιχείου2. . . } μεταβλητή1, μεταβλητή2, ...; |
λέξη-κλειδί | struct | ένωση |
Μέγεθος | Μέγεθος δομής = άθροισμα του μεγέθους όλων των μελών δεδομένων. | Μέγεθος της Ένωσης = μέγεθος των μεγαλύτερων μελών. |
Κατάστημα αξία | Αποθηκεύει ξεχωριστές τιμές για όλα τα μέλη. | Αποθηκεύει την ίδια τιμή για όλα τα μέλη. |
Κάθε φορά | Μια δομή αποθηκεύει πολλαπλές τιμές, των διαφόρων μελών, της δομής. | Μια ένωση αποθηκεύει μία μόνο τιμή κάθε φορά για όλα τα μέλη. |
Τρόπος προβολής | Παρέχετε έναν τρόπο για να δείτε κάθε θέση μνήμης. | Παρέχετε πολλούς τρόπους για να δείτε την ίδια θέση μνήμης. |
Ανώνυμο χαρακτηριστικό | Δεν υπάρχει ανώνυμη λειτουργία. | Μπορεί να δηλωθεί ανώνυμη ένωση. |
Ορισμός δομής
Η δομή είναι μια συλλογή μεταβλητών διαφορετικών τύπων δεδομένων, οι οποίες αναφέρονται με ένα κοινό όνομα. Οι μεταβλητές σε μια δομή ονομάζονται "μέλη". Από προεπιλογή, όλα τα μέλη μιας δομής είναι "δημόσια". Όταν δηλώνετε μια δομή, δημιουργείτε ένα πρότυπο, το οποίο μπορεί να χρησιμοποιηθεί για τη δημιουργία αντικειμένων δομής, που μοιράζονται την ίδια οργάνωση δεδομένων μελών και λειτουργίες μελών. Η δήλωση της δομής ακολουθεί πάντα η λέξη κλειδί "struct", η οποία λέει στον μεταγλωττιστή ότι έχει δηλωθεί μια δομή. Ας πάρουμε ένα παράδειγμα.
Ας πάρουμε ένα παράδειγμα.
struct employee {όνομα συμβολοσειράς. συμβολοσειρά εταιρικού ονόματος; πόλη χορδών? } emp1, emp2.
Εδώ, δηλώνουμε μια δομή για την αποθήκευση των πληροφοριών των εργαζομένων. Η δήλωση τερματίζεται με ένα ερωτηματικό, καθώς η δήλωση δομής είναι μια δήλωση και στην C ++ η δήλωση τερματίζεται με ένα ερωτηματικό.
Το όνομα που δίνεται σε μια δομή ορίζει έναν "τύπο" (στο παραπάνω παράδειγμα το όνομα της δομής είναι "υπάλληλος"). Οι μεταβλητές αυτών των τύπων θα μπορούσαν να δημιουργηθούν, όπως παραπάνω, δημιουργήσαμε δύο μεταβλητές 'emp1' και 'emp2' του τύπου 'employee'. Στο παραπάνω παράδειγμα δημιουργήσαμε μια μεταβλητή «δομής» αμέσως μετά τη δήλωση. εναλλακτικά, θα μπορούσε να δημιουργηθεί χωριστά.
struct emp1, emp2; // η λέξη-κλειδί struct δεν είναι υποχρεωτική.
Τα μέλη μιας μεταβλητής δομής μπορούν να αρχικοποιηθούν ή να έχουν πρόσβαση μέσω του τελεστή dot (.).
emp1.name = "ashok";
Οι πληροφορίες που περιέχονται σε μια μεταβλητή δομής μπορούν να αντιστοιχιστούν σε μια άλλη μεταβλητή δομής του ίδιου τύπου που ακολουθεί.
emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Δελχί"; emp2 = emp1; // αναθέτοντας τιμές του μέλους emp1 σε emp2. cout <
Εδώ, αναθέσαμε τη μεταβλητή δομή «emp1» σε «emp2» έτσι, το «emp1» αντιγράφει όλη την αξία των μελών του στο αντίστοιχο μέλος του 'epm2'.
Το μέλος της μεταβλητής δομής μπορεί να μεταβιβαστεί στη λειτουργία.
funct (emp1.city);
Η μεταβλητή ολόκληρης της δομής μπορεί να μεταβιβαστεί στη συνάρτηση, τόσο από τις μεθόδους κλήσης βάσει τιμής όσο και από την κλήση με αναφορά.
funt (emp1); // λειτουργία κλήσης με μέθοδο κλήσης βάσει τιμής. . . void funct (struct emp emp) {// αξίες λήψης των μελών του emp1. cout <
Εδώ, η μεταβολή στην τιμή ενός μέλους της μεταβλητής δομής δεν θα αντανακλάται εκτός της συνάρτησης καθώς η μεταβλητή έχει περάσει από τη μέθοδο κλήσης βάσει τιμής. Τώρα ας κάνουμε το ίδιο πράγμα με κλήση με τη μέθοδο αναφοράς.
funt (& emp1); // λειτουργία κλήσης από κλήση με τη μέθοδο αναφοράς. . . άκυρη λειτουργία (struct employee * emp) {// λήψη της διεύθυνσης emp1. emp-> πόλη = "Nur"; // αλλάξτε την τιμή του μέλους (πόλης) της μεταβλητής δομής emp1. . }}
Εδώ, η μεταβλητή δομής διαβιβάζεται με αναφορά, έτσι ώστε η μεταβολή στην τιμή των μελών της μεταβλητής δομής να αντικατοπτρίζεται επίσης εκτός της λειτουργίας.
srtuct υπάλληλος * emp; // αποκάλυψη του δείκτη δομής του υπαλλήλου τύπου. emp = emp1; // αναθέτοντας τη διεύθυνση του emp1 στον δείκτη. emp-> city // pointer που έχει πρόσβαση στην πόλη μέλους του emp1.
Μπορεί επίσης να δημιουργηθεί ο δείκτης στη δομή. κρατά τη διεύθυνση της μεταβλητής δομής.
Στη δομή επιτρέπεται η αθροιστική αρχικοποίηση όταν ο ορισμός της δομής δεν περιέχει, κανένα κατασκευαστή που έχει οριστεί από τον χρήστη ή εικονικές λειτουργίες ή κλάση βάσης ή ιδιωτικό ή προστατευμένο πεδίο.
int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Πιθανό ως δομή του υπαλλήλου δεν περιέχει κανένα από τα παραπάνω αναφέρει τα πράγματα.
Ορισμός της Ένωσης
Μια ένωση είναι μια θέση μνήμης που μοιράζεται με δύο ή περισσότερους διαφορετικούς τύπους μεταβλητών που δηλώνονται κάτω από έναν ενιαίο τύπο συνέντευξης. Η λέξη-κλειδί που χρησιμοποιείται για να δηλωθεί μια ένωση είναι "ένωση". Στην C ++, μια ένωση μπορεί να περιέχει και τη συνάρτηση μελών και τις μεταβλητές. Από προεπιλογή, όλα τα μέλη της ένωσης είναι "δημόσια". Η δήλωση της "ένωσης" είναι παρόμοια με τη δήλωση της δομής.
ένωση u_type {int x, char c; float f; } u1, u2.
Εδώ είχαμε δηλώσει μια ένωση που ονομάζεται u_type. Τα μέλη του u_type είναι 'x' τύπου ακέραιου τύπου, 'c' τύπου χαρακτήρα και 'f' τύπου float. Είχαμε επίσης δημιουργήσει τις μεταβλητές συνδικάτων «u1» και «u2», τύπου 'u_type', αμέσως μετά τη δήλωση μιας ένωσης. Μπορούμε επίσης να δηλώσουμε τη συνένωση συνδικάτου ξεχωριστά από τη δήλωση μιας ένωσης.
int κύρια () {ένωση u_type u1, u2; // Η ένωση λέξεων-κλειδιών δεν είναι υποχρεωτική στη C ++. }}
Η πρόσβαση των μελών της ένωσης μπορεί να γίνει χρησιμοποιώντας τον τελεστή dot (.), Ο οποίος προηγείται από την ένωση συντρόφων και ακολουθεί το μέλος αυτής της μεταβλητής.
u1.x = 10;
Όπως και οι δομές, η συνολική αρχικοποίηση δεν είναι δυνατή σε μια ένωση. Όπως γνωρίζουμε, η ένωση μοιράζεται την ίδια θέση μνήμης για το σύνολο του μέλους τη φορά, μόνο μία μεταβλητή αρχικοποιείται και όλες οι μεταβλητές ενημερώνονται αυτόματα με την αρχικοποιημένη τιμή.
u1.x = 10; cout <
Αν προσπαθήσετε να αλλάξετε την τιμή οποιουδήποτε μέλους του 'u1'. Το άλλο μέλος θα ενημερωθεί αυτόματα σε αυτήν την τιμή.
u1.c = 65; cout <
Ο χώρος που έχει κατανεμηθεί στην ένωση είναι ίσος με το μέγεθος του μεγαλύτερου μέλους της ένωσης. Δεδομένου ότι το byte που αντιστοιχεί στο char είναι 1 byte, το 'int' είναι 4 byte και το 'float' είναι 4 byte έτσι, το μεγαλύτερο μέγεθος είναι 4 byte. Έτσι, η μνήμη που έχει κατανεμηθεί στα 'u1' και 'u2' είναι 4 byte.
int main () {int size_1 = μέγεθοςof (u1); // 4 int μέγεθος_2 = μέγεθοςof (u2); // 4
Ο δείκτης στην ένωση μπορεί να δημιουργηθεί ακριβώς όπως στη δομή. Ο δείκτης κρατά τη διεύθυνση της ένωσης.
ένωση u_type * un; un = & u1; cout < Όπως και η δομή, η ένωση μπορεί επίσης να μεταβιβαστεί στις λειτουργίες και με τις δύο μεθόδους, δηλαδή με κλήση με τιμή και κλήση με αναφορά. funct (u1); // λειτουργία κλήσης με μέθοδο κλήσης βάσει τιμής. . . άκυρη λειτουργία (ένωση u_type un) {// λήψη της τιμής του μέλους του u1. cout < Τώρα, ας καλέσουμε τη λειτουργία χρησιμοποιώντας τη μέθοδο κλήσης με αναφορά. funct (& u1); // λειτουργία κλήσης με κλήση με μέθοδο refrence. . . άκυρη λειτουργία (ένωση u_type un) {// λήψη της διεύθυνσης του u1. un-> χ = 20. }} Υπάρχει ένας ειδικός τύπος ένωσης στην C ++ που ονομάζεται Ανώνυμος Ένωση ". Η ανώνυμη ένωση δεν μπορεί να έχει το όνομα του τύπου και δεν μπορεί να δημιουργηθεί μεταβλητή τέτοιας ένωσης. Είναι μόνο να πείτε στον μεταγλωττιστή ότι οι μεταβλητές μελών του πρέπει να μοιράζονται την ίδια θέση. Η μεταβλητή μιας ανώνυμης ένωσης μπορεί να αναφερθεί χωρίς τον κανονικό τελεστή (.). int main () {union {// καθορίστε την ανώνυμη ένωση χωρίς το όνομα του τύπου. int x, char c; float f; }, x = 10; // αναφέρθηκε η μεταβλητή συνένωση με τον τελεστή cout < Σε ανώνυμη ένωση δεν επιτρέπεται η λειτουργία μελών, δεν μπορεί να περιέχει ιδιωτικά ή προστατευμένα δεδομένα και η παγκόσμια ανώνυμη ένωση πρέπει να ορίζεται ως «στατική». Τα σημεία που πρέπει να θυμάστε για τη συνήθη δήλωση ενώσεων. Τόσο η δομή όσο και η ένωση είναι ο τύπος του δοχείου που περιέχει το μέλος διαφορετικών τύπων. Ωστόσο, οι δομές χρησιμοποιούνται όταν πρέπει να αποθηκεύουμε ξεχωριστή τιμή για όλα τα μέλη σε μια ξεχωριστή θέση μνήμης. Τα συνδικάτα χρησιμοποιούνται όταν απαιτείται μετατροπή τύπου.
Ομοιότητες:
Συμπέρασμα: