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

Anonim

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

Τι είναι η κλάση και το αντικείμενο:

Αυτές είναι οι δύο σημαντικές έννοιες που σχετίζονται με τον Αντικειμενοστρεφή Προγραμματισμό και αποτελούν τη βάση για την πλαισίωση των λειτουργιών και των δεδομένων που διαβιβάζονται σε άλλες λειτουργίες. Για μια καλύτερη κατανόηση, μπορούμε να την συσχετίσουμε με ένα πραγματικό παράδειγμα. Μια κατηγορία μπορεί να θεωρηθεί ως κατάστημα και ένα αντικείμενο μπορεί να είναι οποιοδήποτε από τα μεμονωμένα καταστήματα όπως το παντοπωλείο, τα χαρτικά, τα φρούτα κ.λπ. Όλα τα αντικείμενα μοιράζονται τις κοινές ιδιότητες της κύριας κατηγορίας - το κατάστημα - και με τη σειρά του, τα αντικείμενα μπορεί να έχουν τις δικές τους αποκλειστικές ιδιότητες, όπως ένα συγκεκριμένο σχέδιο, φωτισμό κλπ. Μέσω των αντικειμένων μπορούμε πραγματικά να χρησιμοποιήσουμε την τάξη. αποτελούν τις περιπτώσεις μιας τάξης.

Σύνταξη κλάσης

Κατάστημα {

δημόσια συμβολοσειρά κειμένου;

δημόσιος σχεδιασμός συμβολοσειρών.

}

Σύνταξη ενός αντικειμένου

Κατάστημα παντοπωλείων = νέο Κατάστημα ();

Αποθηκεύστε χαρτικά = νέο κατάστημα ();

Τι είναι μια δομή;

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

struct grocery_entrance {

char input_name [50];

int input_size;

} grocery_entrance;

Όλα τα καταστήματα μπορούν να χρησιμοποιήσουν την είσοδο Struct με μεμονωμένα ονόματα και μεγέθη.

Τι είναι κληρονομικότητα;

Είναι παρόμοιο με το πώς ένας γιος κληρονομεί τα υπάρχοντα του πατέρα του και, με τη σειρά του, ο γιος μπορεί επίσης να προσθέσει κάποιες άλλες δικές του ιδιοκτησίες. Η κλάση μπορεί να είναι είτε μια βασική κατηγορία είτε μια παράγωγη κλάση, στην οποία η πρώτη μπορεί να ληφθεί ως βάση για να σχηματιστεί η τελευταία. Η παράγωγη κλάση προσθέτει λίγες άλλες ιδιότητες εκτός από αυτό που παίρνει από την βασική κλάση. Όταν εξετάζουμε το παραπάνω παράδειγμα, το μπακάλικο μπορεί να παραχθεί ακόμα και σε ένα συγκεκριμένο παντοπωλείο, όπως το μπακάλικο XYZ.

Τώρα που γνωρίζουμε τις βασικές έννοιες, μπορούμε να βρούμε την πραγματική διαφορά μεταξύ Class και Struct.

Πώς διαφέρουν;

  • Επαναχρησιμοποίηση: Καθώς οι κλάσεις αποτελούν το βασικό πλαίσιο, μπορούν να επαναχρησιμοποιηθούν. Οι δομές, ωστόσο, είναι μεμονωμένα στοιχεία με συγκεκριμένες ιδιότητες, επομένως δεν μπορούν να επαναχρησιμοποιηθούν. Για παράδειγμα, η τάξη παντοπωλείων μπορεί να χρησιμοποιηθεί για κάθε είδος μπακάλικου, αλλά το Struct grocery_entrance είναι συγκεκριμένο για αυτό μόνο και δεν υπάρχει λόγος να το χρησιμοποιήσετε ξανά σε άλλες κατηγορίες.
  • Ορατότητα: Όλες οι λειτουργίες μιας κλάσης είναι διαθέσιμες στο κοινό στα αντικείμενα της.Για παράδειγμα, έχουμε μια λειτουργία που ονομάζεται 'πράγματα' στο κατάστημα 'Class'. Η λειτουργία «πράγματα» είναι ορατή σε όλα τα Αντικείμενα της, όπως «κατάστημα παντοπωλείων», «κατάστημα χαρτικών» κ.λπ. Η ορατότητα αυτή δεν είναι εφικτή με τα Structs καθώς τα δεδομένα της δομής περιορίζονται στον εαυτό της και δεν είναι ορατά σε άλλα Structs. Για να καταστήσουμε ξεκάθαρα τα πράγματα, μπορούμε να πούμε ότι τα δεδομένα του «grocery_entrance» δεν είναι δημόσια ορατά σε όλα τα άλλα καταστήματα.
  • Pass by Reference & Pass by Value: Το Pass by Reference αποστέλλει μόνο τις θέσεις μνήμης και όχι τα πραγματικά δεδομένα στις λειτουργίες. Αυτό σημαίνει ότι κάθε φορά που αλλάζει η τιμή, η αλλαγή αντικατοπτρίζεται στις αντίστοιχες λειτουργίες. Το pass by value, με τη σειρά του, απλά στέλνει την τιμή στη λειτουργία. Σε αυτήν την περίπτωση, μια αλλαγή στην αξία μετά την αποστολή δεν θα αντικατοπτρίζεται στη λειτουργία. Οι ταξικές χρήσεις περνούν με παραπομπή και το Struct χρησιμοποιεί την τιμή περάσματος.
  • Κληρονομικότητα: Οι κλάσεις μπορούν να κληρονομηθούν περαιτέρω για να σχηματίσουν υποκατηγορίες, αλλά η Structs δεν μπορεί να χρησιμοποιήσει την κληρονομιά. Για παράδειγμα, το Class Store δίνει τις λειτουργίες του στο υποκατάστημα «μπακάλικο». Όμως, το Struct 'grocery_entrance' δεν μπορεί να κληρονομήσει καμία λειτουργία. Μπορούμε να πούμε ότι δεν υπάρχει έννοια όπως η υπο-δομή εδώ.
  • Προεπιλεγμένη ορατότητα: Όλα τα μέλη μιας κλάσης διατηρούνται ως ιδιωτικές οντότητες εξ ορισμού, ενώ τα μέλη ενός Struct διατηρούνται ως δημόσιοι φορείς εξ ορισμού.
  • Το μέγεθος μιας κενής κλάσης Class και Struct: χρησιμοποιεί μέγεθος 1 byte ακόμα και όταν είναι άδειο, ενώ το Struct δεν χρησιμοποιεί ποτέ καμία μνήμη όταν είναι κενό. Αυτό σημαίνει ότι μπορούμε να πούμε ότι το μέγεθος μιας κενής δομής ισούται με 0 Bytes.
  • Συλλογή σκουπιδιών: Η συλλογή σκουπιδιών είναι δυνατή με τις κλάσεις, καθώς χρησιμοποιούν τη δική τους παραπομπή. Ως εκ τούτου, είναι ευκολότερο να γίνει ο καθαρισμός σε μια θέση όπου αποθηκεύονται τα δεδομένα. Από την άλλη πλευρά, η συλλογή σκουπιδιών δεν είναι δυνατή με το Struct, καθώς χρησιμοποιεί περάσματα από την τιμή και τα δεδομένα είναι διάσπαρτα σε διαφορετικές θέσεις.
  • Διαχείριση μνήμης: Επειδή η κλάση επιτρέπει τις συλλογές απορριμμάτων, η διαχείριση μνήμης είναι επίσης αποτελεσματική. Ωστόσο, δεν είναι τόσο αποτελεσματικό με το Structs.
  • Κατασκευαστής: Ένας κατασκευαστής γενικά αρχικοποιεί την κλάση με ορισμένες καθορισμένες τιμές. Μπορούμε να το δούμε σαν κάτι που έχει αρχικοποιηθεί με αξίες. Εάν πρέπει να δημιουργηθεί μια νέα κλάση, ο κατασκευαστής καλείται να διαθέσει μνήμη για την περίπτωση αυτή. Μπορούμε ακόμη να περάσουμε αξίες ως επιχειρήματα ενώ καλούμε έναν κατασκευαστή. Ας έλθουμε τώρα στην πραγματική μας συζήτηση. Οι κλάσεις επιτρέπουν σε κατασκευαστές όλων των τύπων, όπως με ή χωρίς επιχειρήματα, ενώ οι δομές επιτρέπουν μόνο στους κατασκευαστές με επιχειρήματα, i. μι. τους παραμετροποιημένους κατασκευαστές.
  • Καταστροφέας: Ο καταστροφέας ονομάζεται κάθε φορά που πρέπει να διαγράψουμε ένα στιγμιότυπο μιας κλάσης. Ο καταστροφέας, με τη σειρά του, διαγράφει αυτή την περίπτωση και ελευθερώνει μνήμη. Μια κλάση μπορεί να χρησιμοποιήσει έναν καταστροφικό παράγοντα, ενώ ένα Struct δεν μπορεί.
  • Αρχικοποίηση μεταβλητών μελών: Στις κατηγορίες, μπορούμε να αρχικοποιήσουμε άμεσα τις μεταβλητές μέλους. μια τέτοια αρχικοποίηση δεν είναι δυνατή με το Structs.
  • Δημιουργία αντικειμένου: Η γενική σύνταξη για τη δημιουργία αντικειμένων στις κλάσεις είναι:

Demo obj = new Demo ();

Αυτό σημαίνει ότι πρέπει να χρησιμοποιήσουμε τη λέξη-κλειδί 'new' ενώ δημιουργούμε αντικείμενα μιας κλάσης.Αυτό δεν είναι απαραίτητο κατά τη δημιουργία αντικειμένων Structs. Απλά ρίξτε μια ματιά στη σύνταξή τους:

Demo obj;

Λειτουργεί τέλεια ακόμα και χωρίς τη λέξη «νέα».

Πότε να χρησιμοποιήσετε την κλάση και πότε να χρησιμοποιήσετε τη δομή;

Καθώς οι κλάσεις είναι πιο ευέλικτες στην παράδοση δεδομένων και λειτουργιών μαζί, μπορούμε να την προχωρήσουμε όταν τα αντικείμενα που χρησιμοποιούνται είναι πολύπλοκα και μεγάλα. Στο παράδειγμά μας, ένα Mall μπορεί να χρησιμοποιήσει το κατάστημα της τάξης για να εκφράσει το σύστημα με καλύτερο τρόπο. Οι δομές, ωστόσο, περιορίζονται σε μικρότερα αντικείμενα, καθώς είναι συγκριτικά λιγότερο αποτελεσματικά από τις κλάσεις. Επομένως, εάν σχεδιάζετε ένα δικό σας κατάστημα, τα Structs είναι η καλύτερη επιλογή.

Πώς να μετατρέψετε μια δομή σε μια κλάση και αντίστροφα;

Μπορεί να έχετε ακούσει τους όρους «μποξ» και «unboxing» για να μετατρέψετε ένα Struct σε μια κλάση και αντίστροφα. Αν και αυτές είναι αποτελεσματικές διαδικασίες για να μας βοηθήσουν στη μετατροπή, θα πρέπει να αντιμετωπίζονται με προσοχή. Καθώς αυτό επηρεάζει άμεσα τις θέσεις μνήμης, υπάρχει τεράστιο αντίκτυπο στην απόδοση του συστήματός μας. Επιπλέον, επηρεάζει τις διαδικασίες συλλογής σκουπιδιών και έχει ως αποτέλεσμα τη γενική αναποτελεσματικότητα του συστήματος. Επομένως, χρησιμοποιήστε αυτές τις μετατροπές μόνο όταν χρειάζεται.

Ας δούμε τις προαναφερθείσες διαφορές σε μορφή πίνακα.

S. Όχι Έννοιες Διαφορές
Κλάση Struct
1 Επαναχρησιμοποίηση Όλες οι λειτουργίες μιας κλάσης είναι ορατές στα αντικείμενα της Τα δεδομένα ενός αντικειμένου ενός Struct δεν είναι ορατά σε άλλα αντικείμενα της ίδιας δομής
3 Pass by Reference & Pass by Value > Χρησιμοποιεί Pass by Reference Χρησιμοποιεί Pass by Value 4
Κληρονομικότητα Οι λειτουργίες μιας κλάσης μπορούν να κληρονομηθούν από τις υποκατηγορίες της. επιτρέπει την κληρονομιά Ποτέ δεν επιτρέπει κληρονομικότητα 5
Προεπιλεγμένη ορατότητα Όλα τα μέλη μιας κλάσης είναι ιδιωτικά από προεπιλογή Όλα τα μέλη ενός Struct είναι δημόσια από προεπιλογή Μέγεθος Όταν είναι άδειο
Το μέγεθος μιας κενής κλάσης είναι 1 Byte Το μέγεθος του άδειου Struct είναι 0 Bytes 7 Συλλογή απορριμμάτων
Η χρήση της συλλογής σκουπιδιών δεν είναι δυνατή 8 Διαχείριση μνήμης
Η ευκολία της διαδικασίας συλλογής απορριμμάτων βοηθά στην αποτελεσματική διαχείριση μνήμης Διαχείριση μνήμης 9 Κατασκευαστές
Επιτρέπει κατασκευαστές όλων των τύπων, όπως με ή χωρίς παραμέτρους Επιτρέπει μόνο παραμετροποιημένους κατασκευαστές 10 Καταστροφές
χρησιμοποιήστε το 11 Μετατροπείς μελών Initialization Επιτρέπει την άμεση προετοιμασία των μεταβλητών μελών
Δεν επιτρέπει άμεση αρχικοποίηση των μεταβλητών μελών 12 < Δημιουργία αντικειμένου Είναι απαραίτητο να χρησιμοποιήσετε τη λέξη-κλειδί 'new' κατά τη δημιουργία αντικειμένου Πότε πρέπει να χρησιμοποιήσετε τη λέξη-κλειδί 'new' κατά τη δημιουργία αντικειμένου
13 Καλύτερα για μεγαλύτερα και πολύπλοκα αντικείμενα όπου απαιτείται κληρονομικότητα Καλύτερα για μικρότερα και απλούστερα αντικείμενα όπου η κληρονομιά είναι λιγότερο σημαντική.
Έχουμε καλύψει σχεδόν όλες τις διαφορές μεταξύ Class και Struct, και αν νομίζετε ότι κάτι λείπει, ενημερώστε μας. Ας μάθουμε μαζί και να αξιοποιήσουμε στο έπακρο αυτή τη γνώση!