Διαφορά μεταξύ της δομής και της Ένωσης

Συγγραφέας: Laura McKinney
Ημερομηνία Δημιουργίας: 1 Απρίλιος 2021
Ημερομηνία Ενημέρωσης: 7 Ενδέχεται 2024
Anonim
Παρουσίαση οδηγού σύνδεσης wolfcraft Undercover Jig 4642000
Βίντεο: Παρουσίαση οδηγού σύνδεσης wolfcraft Undercover Jig 4642000

Περιεχόμενο


Το C ++ επιτρέπει όλους τους πέντε τρόπους με τους οποίους παρέχεται η γλώσσα C για τη δημιουργία προσαρμοσμένων δεδομένων. Αυτοί οι πέντε τρόποι είναι «δομή», «bit-field», «ένωση», «απαρίθμηση», «typedef». Στο παρακάτω άρθρο πρόκειται να μελετήσουμε τη διαφορά μεταξύ δομής και ένωσης. Η δομή και η ένωση είναι και οι δύο τύποι δεδομένων περιέκτη που μπορούν να διατηρούν δεδομένα οποιουδήποτε "τύπου". Η μία σημαντική διαφορά που διακρίνει τη δομή και την ένωση είναι ότι η δομή έχει ξεχωριστή θέση μνήμης για καθένα από τα μέλη της, ενώ τα μέλη μιας ένωσης μοιράζονται την ίδια θέση μνήμης.

Ας καταλάβουμε τη διαφορά μεταξύ της δομής και της ένωσης, μαζί με ένα διάγραμμα σύγκρισης.

  1. Συγκριτικό διάγραμμα
  2. Ορισμός
  3. Βασικές διαφορές
  4. Ομοιότητες
  5. συμπέρασμα

Συγκριτικό διάγραμμα

Βάση σύγκρισηςΔομήΕνωση
ΒασικόςΗ χωριστή θέση μνήμης κατανέμεται σε κάθε μέλος της δομής.Όλα τα μέλη της ένωσης μοιράζονται την ίδια θέση μνήμης.
Δήλωση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 <Χ; // 10

Όπως και η δομή, η ένωση μπορεί επίσης να μεταβιβαστεί στις λειτουργίες και με τις δύο μεθόδους, δηλαδή με κλήση με τιμή και κλήση με αναφορά.

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 <

Σε ανώνυμη ένωση δεν επιτρέπεται η λειτουργία μελών, δεν μπορεί να περιέχει ιδιωτικά ή προστατευμένα δεδομένα και η παγκόσμια ανώνυμη ένωση πρέπει να ορίζεται ως «στατική».

Τα σημεία που πρέπει να θυμάστε για τη συνήθη δήλωση ενώσεων.

  • Ο ορισμός μιας ένωσης μπορεί επίσης να περιέχει κατασκευαστή και καταστροφικό παράγοντα.
  • Η ένωση παρέχει τους πολλαπλούς τρόπους για να προβάλετε την ίδια θέση μνήμης.
  • Η ένωση δεν μπορεί να κληρονομήσει την τάξη οποιουδήποτε τύπου.
  • Η ένωση δεν μπορεί να είναι μια βασική κατηγορία.
  • Η ένωση δεν μπορεί να έχει τη λειτουργία του εικονικού μέλους.
  • Η ένωση δεν μπορεί να έχει μια στατική μεταβλητή.
  1. Η δομή χρησιμοποιεί διαφορετική θέση μνήμης για διαφορετικά μέλη. Ως εκ τούτου, η ξεχωριστή τιμή μπορεί να κατανεμηθεί σε όλα τα μέλη. Όμως, η ένωση παραχωρεί την ίδια θέση μνήμης σε όλα τα μέλη. Ως εκ τούτου, μια ενιαία τιμή μπορεί να κατανεμηθεί σε όλα τα μέλη.
  2. Η δομή έχει διαφορετική θέση μνήμης για όλα τα μέλη. ως εκ τούτου, μπορεί να περιέχει πολλαπλές τιμές κάθε φορά και, όπως γνωρίζουμε, η ένωση μοιράζεται την ίδια θέση μνήμης για όλα τα μέλη, επομένως, μπορεί να αποθηκεύσει μία μόνο τιμή τη φορά.
  3. Γενικά, το συνολικό μέγεθος της δομής είναι μεγαλύτερο από το συνολικό μέγεθος της ένωσης επειδή το μέγεθος μιας δομής είναι το άθροισμα του μεγέθους όλων των μελών των δομών και το μέγεθος της ένωσης είναι το μέγεθος του μέλους του μεγαλύτερου τύπου.
  4. Η δομή παρέχει ενιαία προβολή σε κάθε τοποθεσία, ενώ η ένωση παρέχει τις πολλαπλές προβολές μιας μόνο τοποθεσίας.
  5. Μπορείτε να δηλώσετε μια ανώνυμη ένωση αλλά όχι μια ανώνυμη δομή.

Ομοιότητες:

  • Τόσο η δομή όσο και η ένωση έχουν τον ίδιο τρόπο δήλωσης, δημιουργώντας μεταβλητές και τον ίδιο τρόπο πρόσβασης στα μέλη των μεταβλητών.
  • Τόσο η δομή όσο και η ένωση μπορούν να μεταβιβαστούν σε μια λειτουργία τόσο από τις μεθόδους κλήσης βάσει τιμής όσο και από κλήση με αναφορά.
  • Τόσο η δομή όσο και η ένωση είναι τύπος δεδομένων δοχείου και περιέχουν ένα αντικείμενο οποιουδήποτε τύπου δεδομένων, συμπεριλαμβανομένης άλλης δομής, ένωσης, συστοιχίας ως μελών.

Συμπέρασμα:

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