Όπως φαίνεται στον παραπάνω κώδικα, χωρίς περαιτέρω μελέτη της C++, οι χρήστες συνήθως πιστεύουν ότι ο κώδικας στον κατασκευαστή είναι η προετοιμασία των μεταβλητών μελών της κλάσης, αλλά το γεγονός είναι ακριβώς το αντίθετο Στη C++, η κύρια δήλωση του κατασκευαστή ξεκινά μόνο Οι μεταβλητές μέλους δεν μπορούν να ονομαστούν αρχικοποίηση με την πραγματική έννοια, επειδή η προετοιμασία μπορεί να αρχικοποιηθεί μόνο μία φορά, ενώ ο κατασκευαστής μπορεί να εκχωρήσει τιμές σε μεταβλητές μέλους πολλές φορές, για παράδειγμα:
Αυτή τη στιγμή, εισάγεται η λίστα αρχικοποίησης στη C++. Η λίστα αρχικοποίησης είναι μια λίστα μελών δεδομένων που αρχίζει με ":" (άνω τελεία) και διαχωρίζεται με "," (κόμμα) Κάθε μεταβλητή μέλους ακολουθείται από μια αγκύλη και η τιμή που τοποθετείται στην αγκύλη είναι η αρχικοποιημένη τιμή, για παράδειγμα. :
Κάθε μεταβλητή μέλους μπορεί να εμφανιστεί μόνο μία φορά στη λίστα αρχικοποίησης (η αρχικοποίηση μπορεί να αρχικοποιηθεί μόνο μία φορά)
Η κλάση περιέχει τα ακόλουθα μέλη, τα οποία πρέπει να τοποθετηθούν στη λίστα αρχικοποίησης για προετοιμασία:
Μεταβλητές μελών αναφοράς
Μεταβλητές μέλους προσαρμοσμένου τύπου (και ο προσαρμοσμένος τύπος δεν έχει προεπιλεγμένο κατασκευαστή: έναν κατασκευαστή χωρίς παραμέτρους, έναν πλήρως προεπιλεγμένο κατασκευαστή, έναν κατασκευαστή που δημιουργείται αυτόματα από το σύστημα)
const τροποποιημένες μεταβλητές μέλους
Οι μεταβλητές προσαρμοσμένου μέλους που αναφέρονται παραπάνω (χωρίς προεπιλεγμένο κατασκευαστή) σημαίνουν ότι ο κατασκευαστής της καθορισμένης μεταβλητής προσαρμοσμένου μέλους είναι ένας κατασκευαστής με παραμέτρους και οι παράμετροι πρέπει να περάσουν πριν να αρχικοποιηθεί Όταν ο χρήστης εμφανίσει τον κατασκευαστή, εάν η προετοιμασία Η λίστα δεν είναι γραμμένη, ο μεταγλωττιστής θα τη δημιουργήσει αυτόματα για τον χρήστη, ωστόσο, εάν η προετοιμασία των προσαρμοσμένων μεταβλητών απαιτεί τη συμμετοχή παραμέτρων, το σύστημα δεν θα μεταβιβάσει τις παραμέτρους από προεπιλογή, γεγονός που θα οδηγήσει σε μη αρχικοποίηση για να αποφευχθεί η μη αρχικοποίηση, παρουσιάζεται η κατάσταση για να αποφευχθεί περιττό πρόβλημα στη μετέπειτα χρήση.
1.3 Συμβουλές για τη λίστα αρχικοποίησης
Κατά τη σύνταξη της λίστας αρχικοποίησης, η σειρά αρχικοποίησης των μεταβλητών μελών πρέπει να είναι συνεπής με τη σειρά δήλωσης στην κλάση, επειδή ο μεταγλωττιστής αρχικοποιεί τις μεταβλητές στη σειρά σύμφωνα με τη σειρά δήλωσης, εάν ο χρήστης δεν γράψει με τη σειρά περιττό πρόβλημα, όπως:
Όταν αρχικοποιηθεί όπως φαίνεται στο παραπάνω σχήμα, θα επιτευχθούν αποτελέσματα που δεν συνάδουν με τις προσδοκίες, επομένως τέτοιες λειτουργίες πρέπει να αποφεύγονται κατά τη χρήση του.
2. ρητή λέξη-κλειδί
Για τον κατασκευαστή, υπάρχει επίσης μια λειτουργία αφιερωμένηκατασκευαστής μιας παραμέτρουήΚατασκευαστής με πολλές παραμέτρους αλλά χωρίς προεπιλεγμένη τιμή για την πρώτη παράμετροΜετατροπή σιωπηρού τύπου, για παράδειγμα:
Όταν εκχωρείτε περνώντας μια τιμή, για παράδειγμα:
Date date(2024);
1
Σε επίπεδο μεταγλωττιστή, το 2024 δεν εκχωρείται απευθείας στο αντικείμενο κλάσης που δημιουργήθηκε, αλλά το 2024 μετατρέπεται σε ένα προσωρινό αντικείμενο κλάσης μέσω σιωπηρής μετατροπής και στη συνέχεια εκχωρείται στο αντικείμενο κλάσης που πρέπει να αρχικοποιηθεί μέσω ενός τέτοιου αντικειμένου είναι απαραίτητο Το αρχικοποιημένο αντικείμενο κλάσης είναι Α και το προσωρινό αντικείμενο κλάσης είναι Β:
Date A(2024);
等价于
Date A = B//B的值为2024
1
2
3
Προκειμένου να αποφευχθεί η σιωπηρή μετατροπή, η C++ δημιούργησε τη ρητή λέξη-κλειδί Προσθέτοντας ρητή προτού μπορέσει ο κατασκευαστής να αποτρέψει τη σιωπηρή μετατροπή, για παράδειγμα:
explicitDate(int year):_year(year){}
1
2
3
3. στατικά μέλη
3.1 έννοια στατικού μέλους
Τα μέλη της κλάσης που δηλώνονται ως στατικά ονομάζονται στατικά μέλη της κλάσης. Οι στατικές μεταβλητές μελών πρέπει να αρχικοποιηθούν εκτός της κλάσης, για παράδειγμα:
Τα στατικά μέλη μοιράζονται όλα τα αντικείμενα κλάσης και δεν ανήκουν σε ένα συγκεκριμένο αντικείμενο. Αποθηκεύονται στη στατική περιοχή.
Οι στατικές μεταβλητές μέλους πρέπει να ορίζονται εκτός της κλάσης Η στατική λέξη-κλειδί δεν προστίθεται κατά τον ορισμό.
Τα στατικά μέλη κλάσης μπορούν να προσπελαστούν χρησιμοποιώντας το όνομα κλάσης::στατικό μέλος ή το αντικείμενο.στατικό μέλος
Οι συναρτήσεις στατικών μελών δεν έχουν κρυφό αυτόν τον δείκτη και δεν μπορούν να έχουν πρόσβαση σε κανένα μη στατικό μέλος.
Τα στατικά μέλη είναι επίσης μέλη της τάξης και περιορίζονται από προκριματικά δημόσιας, προστατευμένης και ιδιωτικής πρόσβασης.
4. Youyuan
Οι φίλοι παρέχουν έναν τρόπο να ξεπεράσετε την ενθυλάκωση και μερικές φορές παρέχουν ευκολία. Ωστόσο, οι φίλοι θα αυξήσουν τη σύζευξη και θα καταστρέψουν την ενθυλάκωση, επομένως οι φίλοι δεν πρέπει να χρησιμοποιούνται περισσότερες από μία φορές.
Οι φίλοι χωρίζονται σε: λειτουργίες φίλων και τάξεις φίλων
4.1 Λειτουργίες φίλου
Μια συνάρτηση φίλου σημαίνει ότι όταν μια συνάρτηση εκτός της κλάσης χρειάζεται πρόσβαση σε ένα ιδιωτικό μέλος της κλάσης, μπορεί να προσπελαστεί δηλώνοντας αυτήν τη συνάρτηση στην τάξη ως συνάρτηση φίλου της κλάσης, για παράδειγμα:
Οι συναρτήσεις φίλου μπορούν να έχουν πρόσβαση σε ιδιωτικά και προστατευμένα μέλη μιας κλάσης, αλλά όχι σε συναρτήσεις μέλους της κλάσης
Οι συναρτήσεις φίλου δεν μπορούν να τροποποιηθούν με το const
Οι συναρτήσεις φίλου μπορούν να δηλωθούν οπουδήποτε στον ορισμό μιας κλάσης και δεν περιορίζονται από κριτήρια πρόσβασης κλάσης.
Μια συνάρτηση μπορεί να είναι μια συνάρτηση φίλου πολλών κλάσεων
Η αρχή της κλήσης συναρτήσεων φίλου είναι η ίδια με αυτή των συνηθισμένων συναρτήσεων.
4.2 Μαθήματα φίλων
Όταν μια κλάση θέλει να αποκτήσει πρόσβαση στα ιδιωτικά μέλη μιας άλλης κλάσης, μπορεί να δηλώσει αυτήν την κλάση ως φίλο στην τάξη στην οποία πρέπει να προσπελαστεί και, στη συνέχεια, μπορεί να έχει πρόσβαση στα ιδιωτικά μέλη της, για παράδειγμα:
classTime{friendclassDate;// 声明日期类为时间类的友元类,则在日期类中就直接访问Time类//中的私有成员变量public:Time(int hour =0,int minute =0,int second =0):_hour(hour),_minute(minute),_second(second){}private:int _hour;int _minute;int _second;};classDate{public:Date(int year =1900,int month =1,int day =1):_year(year),_month(month),_day(day){}voidSetTimeOfDate(int hour,int minute,int second){// 直接访问时间类私有的成员变量
_t._hour = hour;
_t._minute = minute;
_t._second = second;}private:int _year;int _month;int _day;
Time _t;};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Οι φιλικές σχέσεις είναι μονόδρομες και μη ανταλλάξιμες. Για παράδειγμα, στην προαναφερθείσα κλάση Time και Date, εάν δηλώσετε την κλάση Date ως την κλάση φίλου στην κλάση Time, μπορείτε να αποκτήσετε απευθείας πρόσβαση στις ιδιωτικές μεταβλητές μέλους της κλάσης Time στην κλάση Date, αλλά θέλετε να πρόσβαση στις ιδιωτικές μεταβλητές μέλους της κλάσης Date στην κλάση Time No.
Η σχέση φίλου δεν μπορεί να είναι μεταβατική Εάν ο Γ είναι φίλος του Β και ο Β είναι φίλος του Α, δεν μπορεί να σημαίνει ότι ο Γ είναι φίλος του Α.
5. Εσωτερική τάξη
Η C++ υποστηρίζει τη δημιουργία μιας άλλης κλάσης μέσα σε μια κλάση, η οποία ονομάζεται εσωτερική κλάση Η εσωτερική κλάση είναι μια ανεξάρτητη κλάση και δεν είναι δυνατή η πρόσβαση στα μέλη της εσωτερικής κλάσης. . Η εξωτερική τάξη δεν έχει καμία ανώτερη πρόσβαση στην εσωτερική τάξη. Και η εσωτερική τάξη είναι φυσικά φίλος της εξωτερικής τάξης, δηλαδή, η εσωτερική τάξη μπορεί να έχει πρόσβαση στα ιδιωτικά μέλη της εξωτερικής τάξης.
χαρακτηριστικό γνώρισμα:
Οι εσωτερικές κλάσεις μπορούν να οριστούν ως δημόσιες, προστατευμένες ή ιδιωτικές σε εξωτερικές κλάσεις.
Σημειώστε ότι οι εσωτερικές κλάσεις μπορούν να έχουν άμεση πρόσβαση στα στατικά μέλη σε εξωτερικές κλάσεις χωρίς να απαιτείται το όνομα αντικειμένου/κλάσης της εξωτερικής κλάσης.
sizeof(external class)=external class, δεν έχει καμία σχέση με εσωτερικές κλάσεις.
6. Συμπέρασμα
Σας ευχαριστώ πολύ που είδατε το αρχικό μου άρθρο. Αυτό το άρθρο χρησιμοποιείται κυρίως για προσωπική μάθηση και ανταλλαγή γνώσεων. Εάν υπάρχουν λάθη, σας ευχαριστώ που με διορθώνετε. Εάν χρειάζεται να αναφέρετε, παρακαλούμε να αναφέρετε τη διεύθυνση.