Εισαγωγή στις κλάσεις και αντικείμενα C ++

click fraud protection

01

από 09

Ξεκινώντας τις κλάσεις C ++

Χέρια πληκτρολογώντας σε φορητό υπολογιστή
Sam Edwards / Getty Images

Αντικείμενα είναι η μεγαλύτερη διαφορά μεταξύ C ++ και C. Ένα από τα πρώτα ονόματα για το C ++ ήταν το C με τις κλάσεις.

Μαθήματα και Αντικείμενα

Μια κλάση είναι ένας ορισμός ενός αντικειμένου. Είναι ένας τύπος ακριβώς όπως int. Μια τάξη μοιάζει με a struct με μια μόνο διαφορά: όλα τα μέλη struct είναι δημόσια από προεπιλογή. Όλα τα μέλη της κατηγορίας είναι ιδιωτικά.

Θυμηθείτε - μια κλάση είναι ένας τύπος και ένα αντικείμενο αυτής της τάξης είναι απλώς ένα μεταβλητός.

Πριν μπορέσουμε να χρησιμοποιήσουμε ένα αντικείμενο, πρέπει να δημιουργηθεί. Ο απλούστερος ορισμός μιας κλάσης είναι:

 όνομα τάξης {

 // μέλη

 }


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

 // παράδειγμα ένα

 #περιλαμβάνω 

 #περιλαμβάνω 


 βιβλίο της τάξης

 {

 int PageCount;

 int CurrentPage; 

 δημόσιο:

 Βιβλίο (int Numpages); // Κατασκευαστής

 ~ Βιβλίο () {}; // Destructor
instagram viewer

 άκυρο SetPage (int Αριθμός σελίδας);

 int GetCurrentPage (κενό);

 }; 


 Βιβλίο:: Βιβλίο (int NumPages) {

 PageCount = NumPages.

 }


 κενό βιβλίο:: SetPage (int Αριθμός σελίδας) {

 CurrentPage = Αριθμός σελίδας;

 }


 int Βιβλίο:: GetCurrentPage (κενό) {

 επιστροφή CurrentPage;

 }


 int main () {

 Βιβλίο ABook (128);

 Ενα βιβλίο. SetPage (56);

 std:: cout << "Τρέχουσα σελίδα" << ABook. GetCurrentPage () << std:: endl;

 επιστροφή 0?

 }


Όλος ο κώδικας από βιβλίο της τάξης προς τα κάτω int Βιβλίο:: GetCurrentPage (κενό) { είναι μέρος της κατηγορίας. ο κύριος() λειτουργία είναι εκεί για να γίνει αυτό μια runnable εφαρμογή.

02

από 09

Κατανόηση της κατηγορίας βιβλίων

Στο κύριος() λειτουργεί μια μεταβλητή ABook του τύπου Book δημιουργείται με την τιμή 128. Μόλις η εκτέλεση φτάσει σε αυτό το σημείο, κατασκευάζεται το αντικείμενο ABook. Στην επόμενη γραμμή η μέθοδος Ενα βιβλίο. SetPage () ονομάζεται και η τιμή 56 εκχωρείται στη μεταβλητή αντικειμένου Ενα βιβλίο. Τρέχουσα σελίδα. Επειτα cout εξάγει την τιμή αυτή καλώντας το Ενα βιβλίο. GetCurrentPage () μέθοδος.

Όταν η εκτέλεση φτάσει στο επιστροφή 0? το αντικείμενο ABook δεν χρειάζεται πλέον από την εφαρμογή. Ο μεταγλωττιστής δημιουργεί μια κλήση προς τον καταστροφέα.

Δηλώνοντας τάξεις

Όλα μεταξύ Βιβλίο της τάξης και το } είναι η δήλωση κλάσης. Αυτή η τάξη έχει δύο ιδιωτικά μέλη, και τα δύο τύπου int. Αυτά είναι ιδιωτικά, επειδή η προεπιλεγμένη πρόσβαση στα μέλη της τάξης είναι ιδιωτική.

ο δημόσιο: οδηγία αναφέρει το μεταγλωττιστής η πρόσβαση από εδώ και στο εξής είναι δημόσια. Χωρίς αυτό, θα ήταν ακόμα ιδιωτικό και θα εμπόδιζε τις τρεις γραμμές της κύριας () συνάρτησης να έχουν πρόσβαση στα μέλη του Abook. Δοκιμάστε να σχολιάσετε το δημόσιο: line out και recompiling για να δείτε τα επόμενα σφάλματα καταγραφής.

Αυτή η παρακάτω γραμμή δηλώνει έναν Κατασκευαστή. Αυτή είναι η λειτουργία που ονομάζεται όταν δημιουργείται αρχικά το αντικείμενο.

 Βιβλίο (int Numpages); // Κατασκευαστής 

Καλείται από τη γραμμή

 Βιβλίο ABook (128); 

Αυτό δημιουργεί ένα αντικείμενο που ονομάζεται ABook του τύπου Book και καλεί τη λειτουργία Book () με το παράμετρο 128.

03

από 09

Περισσότερα για την κατηγορία βιβλίων

Στην C ++, ο κατασκευαστής έχει πάντα το ίδιο όνομα με την κλάση. Ο κατασκευαστής ονομάζεται όταν δημιουργηθεί το αντικείμενο και είναι εκεί που πρέπει να βάλετε τον κώδικα σας για να αρχικοποιήσετε το αντικείμενο.

Στο Βιβλίο Η επόμενη γραμμή μετά τον κατασκευαστή τον καταστροφικό. Αυτό έχει το ίδιο όνομα με τον κατασκευαστή αλλά με ~ (tilde) μπροστά του. Κατά την καταστροφή ενός αντικειμένου, ο καταστροφέας καλείται να τακτοποιήσει το αντικείμενο και να εξασφαλίσει ότι οι πόροι όπως η μνήμη και το αρχείο χειρισμού που χρησιμοποιείται από το αντικείμενο απελευθερώνονται.

Θυμάμαι-Η κλάση xyz έχει μια συνάρτηση constructor xyz () και λειτουργία destructor ~ xyz (). Ακόμη και αν δεν δηλώσετε, ο μεταγλωττιστής θα τα προσθέσει σιωπηλά.

Ο καταστροφέας καλείται πάντα όταν τερματίζεται το αντικείμενο. Σε αυτό το παράδειγμα, το αντικείμενο καταστρέφεται σιωπηρά όταν εξέρχεται από το πεδίο εφαρμογής. Για να δείτε αυτό, τροποποιήστε τη δήλωση καταστροφέα σε αυτό:

 ~ Βιβλίο () {std:: cout << "Destructor ονομάζεται"?}? // Destructor 

Αυτή είναι μια λειτουργία inline με κωδικό στη δήλωση. Ένας άλλος τρόπος για να εισάγετε είναι να προσθέσετε τη λέξη εν σειρά

 inline ~ Βιβλίο (); // Destructor


και προσθέστε τον καταστροφικό ως μια λειτουργία όπως αυτή.

 inline Βιβλίο:: ~ Βιβλίο (κενό) { 

 std:: cout << "Ο καταστρεπτικός ονομάζεται"?

 }


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

04

από 09

Γράφοντας μεθόδους κλάσης

Η καλύτερη εξάσκηση για τα αντικείμενα είναι να κάνετε όλα τα δεδομένα ιδιωτικά και να τα αποκτάτε μέσω λειτουργιών γνωστών ως λειτουργίες εξαρτημάτων. SetPage () και GetCurrentPage () είναι οι δύο λειτουργίες που χρησιμοποιούνται για την πρόσβαση στη μεταβλητή αντικειμένου Τρέχουσα σελίδα.

Αλλαξε το τάξη δήλωση για να struct και recompile. Πρέπει να εξακολουθεί να καταρτίζεται και να εκτελείται σωστά. Τώρα οι δύο μεταβλητές PageCount και Τρέχουσα σελίδα είναι προσιτά στο κοινό. Προσθέστε αυτήν τη γραμμή μετά το βιβλίο ABook (128) και θα μεταγλωττιστεί.

 Ενα βιβλίο. PageCount = 9;


Αν αλλάξετε τη δομή πίσω στο τάξη και να ανασυγκροτήσετε, αυτή η νέα γραμμή δεν θα συντάσσεται πλέον ως PageCount είναι πλέον ιδιωτική πάλι.

Η:: Σημείωση

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

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

 #include "book.h" 

05

από 09

Κληρονομιά και πολυμορφισμός

Αυτό το παράδειγμα θα δείξει κληρονομικότητα. Πρόκειται για μια εφαρμογή δύο τάξεων με μια τάξη που προέρχεται από άλλη.

 #περιλαμβάνω 

 #περιλαμβάνω 


 class Point

 {


 int x, y;

 δημόσιο:

 Σημείο (int atx, int). // Κατασκευαστής

 inline virtual ~ Σημείο (); // Destructor

 εικονικό κενό Draw ();

 }; 


 class Circle: public Point {


 int ακτίνα;

 δημόσιο:

 Κύκλος (int atx, int, int στοRadius).

 inline virtual ~ Κύκλος ();

 εικονικό κενό Draw ();

 };



 Σημείο:: Σημείο (int atx, int aty) {

 x = atx;

 y = ay;

 }


 inline σημείο:: ~ Σημείο (άκυρο) { 

 std:: cout << "Το Destructor Point ονομάζεται";

 }


 κενό σημείο:: Ισοπαλία (κενό) {

 std:: cout << "Point:: Σημείο έλξης στο" << x << "" << y << std:: endl;

 }



 Κύκλος:: Κύκλος (int atx, int aty, int στοRadius): Σημείο (atx, aty) {

 ακτίνα = theRadius;

 }


 inline Κύκλος:: ~ Κύκλος () {

 std:: cout << "Circle Destructor ονομάζεται" << std:: endl;

 }


 void Circle:: Ισοπαλία (κενό) {

 Σημείο:: Σχέδιο ();

 std:: cout << "κύκλος" Σημείο έλξης "<
 }


 int main () {

 Circular Circle (10,10,5);

 Ενας κύκλος. Σχεδιάζω() ;

 επιστροφή 0?

 }


Το παράδειγμα έχει δύο κατηγορίες, Point and Circle, μοντελοποιώντας ένα σημείο και έναν κύκλο. Ένα σημείο έχει συντεταγμένες x και y. Η κλάση Circle προέρχεται από την κλάση Point και προσθέτει μια ακτίνα. Και οι δύο κλάσεις περιλαμβάνουν ένα Σχεδιάζω() μέλος. Για να κρατήσουμε αυτό το παράδειγμα σύντομο, η έξοδος είναι απλά κείμενο.

06

από 09

Κληρονομία

Η τάξη Κύκλος προέρχεται από το Σημείο τάξη. Αυτό γίνεται σε αυτή τη γραμμή:

 class Circle: Σημείο {


Επειδή προέρχεται από μια βασική κλάση (Point), ο κύκλος κληρονομεί όλα τα μέλη της τάξης.

 Σημείο (int atx, int). // Κατασκευαστής

 inline virtual ~ Σημείο (); // Destructor

 εικονικό κενό Draw ();


 Κύκλος (int atx, int, int στοRadius).

 inline virtual ~ Κύκλος ();

 εικονικό κενό Draw ();


Σκεφτείτε την κλάση Κύκλος ως την κατηγορία Point με ένα επιπλέον μέλος (ακτίνα). Κληρονομεί τις λειτουργίες μελών της κλάσης βάσης και τις ιδιωτικές μεταβλητές Χ και y.

Δεν μπορεί να εκχωρήσει ή να χρησιμοποιήσει αυτά εκτός από σιωπηρά επειδή είναι ιδιωτικά, οπότε πρέπει να το κάνει μέσω της λίστας Initializer του κατασκευαστή κύκλου. Αυτό είναι κάτι που πρέπει να δεχτείτε όπως είναι για τώρα. Θα επανέλθω στις λίστες initializer σε ένα μελλοντικό φροντιστήριο.

Στον Κατασκευαστή του Κύκλου, πριν το Ράδιο εκχωρείται στο ακτίνα κύκλου, το τμήμα Point του Κύκλου κατασκευάζεται μέσω κλήσης προς τον κατασκευαστή του Point στη λίστα προετοιμασίας. Αυτή η λίστα είναι όλα μεταξύ: και της {κάτω.

 Κύκλος:: Κύκλος (int atx, int aty, int στοRadius): Σημείο (atx, aty) 


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

 int a1 (10).

 int a2 = 10;


Και οι δύο κάνουν το ίδιο.

07

από 09

Τι είναι ο πολυμορφισμός;

Ο πολυμορφισμός είναι ένας γενικός όρος που σημαίνει "πολλά σχήματα". Στην C + +, η απλούστερη μορφή του πολυμορφισμού είναι η υπερφόρτωση των λειτουργιών. Για παράδειγμα, κάλεσαν πολλές λειτουργίες SortArray (arraytype) όπου το sortarray μπορεί να είναι ένα πίνακας από ints ή διπλασιάζει.

Ενδιαφερόμαστε μόνο για τη μορφή πολυμορφισμού OOP εδώ. Αυτό γίνεται κάνοντας μια συνάρτηση (π.χ. Draw ()) εικονικός στην κλάση βάσης Point και στη συνέχεια να την παρακάμψετε στο κλάσης Κύκλος.

Αν και η λειτουργία Σχεδιάζω() είναι εικονική στην παράγωγη κλάση Κύκλος, αυτό δεν είναι πραγματικά αναγκαίο-είναι μόνο μια υπενθύμιση σε μένα ότι αυτό είναι εικονικό. Εάν η συνάρτηση σε μια παράγωγη κλάση αντιστοιχεί σε μια εικονική συνάρτηση στην κλάση βάσης για τύπους ονομάτων και παραμέτρων, είναι αυτόματα εικονική.

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

08

από 09

Κατασκευαστές C ++

Κατασκευαστές

Ένας κατασκευαστής είναι μια συνάρτηση που προετοιμάζει τα μέλη ενός αντικειμένου. Ένας κατασκευαστής γνωρίζει μόνο πώς να οικοδομήσει ένα αντικείμενο της δικής του τάξης.

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

Εάν δεν παρέχεται κανένας κατασκευαστής, τότε ένας προεπιλεγμένος δημιουργείται από τον μεταγλωττιστή χωρίς παραμέτρους. Πρέπει πάντα να υπάρχει κατασκευαστής, ακόμα και αν είναι προεπιλεγμένος και άδειος. Αν παρέχετε έναν κατασκευαστή με παραμέτρους, τότε δεν θα δημιουργηθεί μια προεπιλογή.

Μερικά σημεία για τους κατασκευαστές:

  • Οι κατασκευαστές είναι μόνο λειτουργίες με το ίδιο όνομα με την κλάση.
  • Οι κατασκευαστές προορίζονται να αρχικοποιήσουν τα μέλη της κλάσης όταν δημιουργηθεί μια παρουσία αυτής της κλάσης.
  • Οι κατασκευαστές δεν καλούνται απευθείας (εκτός από τις λίστες προεπιλογών)
  • Οι κατασκευαστές δεν είναι ποτέ εικονικοί.
  • Μπορούν να οριστούν πολλοί κατασκευαστές για την ίδια κλάση. Πρέπει να έχουν διαφορετικές παραμέτρους για να τις διακρίνουν.

Υπάρχουν πολλά περισσότερα για να μάθετε για τους κατασκευαστές, για παράδειγμα, κατασκευαστές προεπιλογής, εκχωρητές και κατασκευαστές αντιγράφων. Αυτά θα συζητηθούν στο επόμενο μάθημα.

09

από 09

Καταστροφή C ++ Καταστροφέων

Ένας καταστροφικός μηχανισμός είναι μια συνάρτηση μέλους κλάσης που έχει το ίδιο όνομα με τον κατασκευαστή (και την κλάση) αλλά με ένα ~ (tilde) μπροστά.

 ~ Κύκλος ();


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

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

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

Στο παράδειγμά μας,

 ~ Κύκλος ();

έπειτα

 ~ Σημείο ();


Ο καταστροφέας κλάσεων βάσης ονομάζεται τελευταίος.

Αυτό συμπληρώνει αυτό το μάθημα. Στο επόμενο μάθημα, μάθετε για τους προεπιλεγμένους κατασκευαστές, τους κατασκευαστές αντιγράφων και την εκχώρηση.

instagram story viewer