Κοινή χρήση τεχνολογίας

C κλάσεις και αντικείμενα (1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Πίνακας περιεχομένων

Διαδικασίας και αντικειμενοστρεφής

Διαδικαστικός Προγραμματισμός

Αντικειμενοστραφής προγραμματισμός

1. Ορισμός τάξης

Μορφή ορισμού τάξης

τομέα κλάσης

2. Προσόντα πρόσβασης τάξης και ενθυλάκωση

προσδιοριστικό πρόσβασης

ενθυλάκωση

3. Instantiation

έννοια στιγμιότυπο

μέγεθος αντικειμένου

4. αυτόν τον δείκτη

Χαρακτηριστικά αυτού του δείκτη


Διαδικασίας και αντικειμενοστρεφής

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

Διαδικαστικός Προγραμματισμός

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

πλεονέκτημα:

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

έλλειψη:

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

Αντικειμενοστραφής προγραμματισμός

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

πλεονέκτημα:

  • Υψηλή συντηρησιμότητα : Ενθυλάκωση συναρτήσεων σε αντικείμενα, αποκρύπτοντας την εσωτερική υλοποίηση των αντικειμένων από τον έξω κόσμο και μειώνοντας τη σύζευξη μεταξύ των μονάδων. Όταν μια συνάρτηση χρειάζεται να τροποποιηθεί, μόνο η εσωτερική υλοποίηση του αντίστοιχου αντικειμένου χρειάζεται να τροποποιηθεί χωρίς να επηρεαστούν άλλα άσχετα μέρη. Για παράδειγμα, σε μια εφαρμογή γραφικής διεπαφής, εάν θέλετε να τροποποιήσετε τη λειτουργία ενός κουμπιού, χρειάζεται μόνο να τροποποιήσετε την αντίστοιχη μέθοδο του αντικειμένου του κουμπιού χωρίς να επηρεάσετε άλλα στοιχεία διεπαφής.
  • Ισχυρή επαναχρησιμοποίηση κώδικα : Η επαναχρησιμοποίηση και η επέκταση κώδικα μπορούν εύκολα να επιτευχθούν μέσω κληρονομικότητας, πολυμορφισμού και άλλων χαρακτηριστικών.Για παράδειγμα, δημιουργήστε μια βασική κλάσηShape(σχήμα) και μετά απορρέουνCircle(γύρος),Rectangle(Rectangle) και άλλες υποκλάσεις, οι υποκλάσεις μπορούν να επαναχρησιμοποιήσουν τα χαρακτηριστικά και τις μεθόδους της βασικής κλάσης και να κάνουν συγκεκριμένες επεκτάσεις.
  • Καλή ευελιξία: Ο αντικειμενοστραφής προγραμματισμός υποστηρίζει πολυμορφισμό, ο οποίος επιτρέπει στο πρόγραμμα να επιλέγει και να εκτελεί δυναμικά αντίστοιχες μεθόδους σύμφωνα με τον πραγματικό τύπο του αντικειμένου κατά τη διάρκεια του χρόνου εκτέλεσης, αυξάνοντας την ευελιξία και την επεκτασιμότητα του προγράμματος.

έλλειψη:

  • Γενικά έξοδα απόδοσης: Εφόσον η δημιουργία αντικειμένων, η κλήση μεθόδου και άλλες λειτουργίες απαιτούν ένα ορισμένο ποσό επιβάρυνσης, σε ορισμένα σενάρια με εξαιρετικά υψηλές απαιτήσεις απόδοσης, μπορεί να επηρεάσει την αποτελεσματικότητα εκτέλεσης του προγράμματος.
  • Υψηλό κόστος μάθησης: Οι έννοιες και τα χαρακτηριστικά του αντικειμενοστρεφούς προγραμματισμού είναι σχετικά πολύπλοκα, γεγονός που καθιστά δύσκολο για τους αρχάριους να μάθουν και να κατανοήσουν.

1. Ορισμός τάξης

Μορφή ορισμού τάξης

• class είναι η λέξη-κλειδί που ορίζει την κλάση, Δεδομένα είναι το όνομα της κλάσης και {} είναι το σώμα της κλάσης Σημειώστε ότι το τελευταίο ερωτηματικό δεν μπορεί να παραλειφθεί στο τέλος του ορισμού της κλάσης. Τα περιεχόμενα στο σώμα της κλάσης ονομάζονται μέλη της κλάσης: οι μεταβλητές της κλάσης ονομάζονται χαρακτηριστικά ή οι μεταβλητές μέλους της κλάσης ονομάζονται μέθοδοι ή συναρτήσεις μέλους της κλάσης.

• Για να διακρίνετε τις μεταβλητές μέλους, είναι γενικά σύνηθες να προσθέτετε ένα ειδικό αναγνωριστικό στη μεταβλητή μέλους, όπως η αρχή με _ ή m πριν ή μετά τη μεταβλητή μέλους Σημειώστε ότι αυτό δεν είναι υποχρεωτικό στη C++, είναι απλώς κάποιες συμβάσεις .

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

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

  1. class Date
  2. {
  3. public:
  4. void Init(int year, int month, int day)
  5. {
  6. _year = year;
  7. _month = month;
  8. _day = day;
  9. }
  10. private:
  11. // 为了区分成员变量,⼀般习惯上成员变量
  12. // 会加⼀个特殊标识,如_ 或者 m开头
  13. int _year; // year_ m_year
  14. int _month;
  15. int _day;
  16. };
  17. int main()
  18. {
  19. Date d;
  20. d.Init(2024, 3, 31);
  21. return 0;
  22. }

τομέα κλάσης

• Η κλάση καθορίζει ένα νέο πεδίο εφαρμογής.

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

  1. #include<iostream>
  2. using namespace std;
  3. class Stack
  4. {
  5. public:
  6. // 成员函数
  7. void Init(int n = 4);
  8. private:
  9. // 成员变量
  10. int* array;
  11. size_t capacity;
  12. size_t top;
  13. };
  14. // 声明和定义分离,需要指定类域
  15. void Stack::Init(int n)
  16. {
  17. array = (int*)malloc(sizeof(int) * n);
  18. if (nullptr == array)
  19. {
  20. perror("malloc申请空间失败");
  21. return;
  22. }
  23. capacity = n;
  24. top = 0;
  25. }
  26. int main()
  27. {
  28. Stack st;
  29. st.Init();
  30. return 0;
  31. }

2. Προσόντα πρόσβασης τάξης και ενθυλάκωση

προσδιοριστικό πρόσβασης

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

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

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

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

• ορίστε τις προεπιλογές σε δημόσιο

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

ενθυλάκωση

Τα τρία κύρια χαρακτηριστικά του αντικειμενοστρεφούς: ενθυλάκωση, κληρονομικότητα και πολυμορφισμός.

Στο στάδιο της κλάσης και του αντικειμένου, μελετάμε κυρίως τα χαρακτηριστικά ενθυλάκωσης των κλάσεων.

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

Η ενθυλάκωση είναι ουσιαστικά ένα είδος διαχείρισης που διευκολύνει τους χρήστες να χρησιμοποιούν κλάσεις. Για παράδειγμα: Για μια σύνθετη συσκευή όπως ένας υπολογιστής, τα μόνα πράγματα που παρέχονται στον χρήστη είναι τα πλήκτρα ενεργοποίησης και απενεργοποίησης, είσοδος πληκτρολογίου, οθόνη, υποδοχή USB κ.λπ., που επιτρέπουν στον χρήστη να αλληλεπιδρά με τον υπολογιστή και να ολοκληρώνει τις καθημερινές εργασίες. Αλλά στην πραγματικότητα, η πραγματική δουλειά του υπολογιστή είναι η CPU, η κάρτα γραφικών, η μνήμη και άλλα εξαρτήματα υλικού.

Για τους χρήστες υπολογιστών, δεν χρειάζεται να ανησυχούν για τα εσωτερικά εξαρτήματα του πυρήνα, όπως πώς είναι διατεταγμένα τα κυκλώματα στη μητρική πλακέτα, πώς έχει σχεδιαστεί η CPU κ.λπ. Οι χρήστες πρέπει μόνο να γνωρίζουν πώς να ενεργοποιούν τον υπολογιστή και πώς να αλληλεπιδρούν με τον υπολογιστή μέσω του πληκτρολογίου και του ποντικιού. Επομένως, όταν οι κατασκευαστές υπολογιστών εγκαταλείπουν το εργοστάσιο, βάζουν ένα κέλυφος στο εξωτερικό για να κρύψουν τις εσωτερικές λεπτομέρειες υλοποίησης και παρέχουν μόνο διακόπτες τροφοδοσίας, υποδοχές ποντικιού και πληκτρολογίου προς τα έξω, έτσι ώστε οι χρήστες να μπορούν να αλληλεπιδρούν με τον υπολογιστή.

Για την υλοποίηση της ενθυλάκωσης στη γλώσσα C++, τα δεδομένα και οι μέθοδοι για δεδομένα λειτουργίας μπορούν να συνδυαστούν οργανικά μέσω κλάσεων και τα δικαιώματα πρόσβασης μπορούν να χρησιμοποιηθούν για την απόκρυψη των εσωτερικών λεπτομερειών υλοποίησης των αντικειμένων και τον έλεγχο των μεθόδων που μπορούν να χρησιμοποιηθούν απευθείας έξω από την κλάση.

3. Instantiation

έννοια στιγμιότυπο

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

• Μια κλάση είναι μια αφηρημένη περιγραφή ενός αντικειμένου. Είναι κάτι σαν μοντέλο, το οποίο περιορίζει τις μεταβλητές μέλους της κλάσης τάξη.

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

μέγεθος αντικειμένου

Αναλύστε ποια μέλη είναι στο αντικείμενο της τάξης; Κάθε αντικείμενο που δημιουργείται από μια κλάση έχει έναν ανεξάρτητο χώρο δεδομένων, επομένως το αντικείμενο πρέπει να περιέχει μεταβλητές μέλους. Πρώτον, μετά τη μεταγλώττιση της συνάρτησης, είναι μια ενότητα εντολών, η οποία δεν μπορεί να αποθηκευτεί στο αντικείμενο. δείκτες για συναρτήσεις μέλους. Ας αναλύσουμε ξανά, είναι απαραίτητο να αποθηκεύσουμε δείκτες στα στιγμιότυπα της ημερομηνίας δύο αντικείμενα d1 και d2 έχουν τις δικές τους ανεξάρτητες μεταβλητές μέλους _year/_month/_day για να αποθηκεύσουν τα δικά τους δεδομένα, αλλά η συνάρτηση μέλους Init/Print. Οι δείκτες των d1 και d2 είναι οι ίδιοι, επομένως η αποθήκευσή τους σε αντικείμενα είναι χαμένη. Εάν χρησιμοποιείτε την Ημερομηνία για να δημιουργήσετε 100 αντικείμενα, τότε ο δείκτης της συνάρτησης μέλους θα αποθηκευτεί 100 φορές, κάτι που είναι υπερβολικά άχρηστο. Στην πραγματικότητα, ο δείκτης συνάρτησης δεν χρειάζεται να αποθηκευτεί. Ο δείκτης της συνάρτησης είναι μια διεύθυνση , όχι κατά το χρόνο εκτέλεσης Μόνο δυναμικός πολυμορφισμός βρίσκεται στο χρόνο εκτέλεσης και οι διευθύνσεις συναρτήσεων πρέπει να αποθηκευτούν.

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

Κανόνες ευθυγράμμισης μνήμης

Οι κανόνες ευθυγράμμισης μνήμης είναι ακριβώς οι ίδιοι με αυτούς στη γλώσσα CΆρθρο αναφοράς:Γλώσσα C για τον υπολογισμό της ευθυγράμμισης μνήμης

Το πρώτο μέλος βρίσκεται στη μετατόπιση διεύθυνσης 0 από τη δομή.

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

• Σημείωση: Logarithm = ο μικρότερος από τον προεπιλεγμένο αριθμό στοίχισης του μεταγλωττιστή και το μέγεθος του μέλους.

•Ο προεπιλεγμένος λογάριθμος στο VS είναι 8

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

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

Εάν δεν υπάρχει μεταβλητή μέλους, πρέπει να δοθεί 1 byte, γιατί αν δεν δοθεί ούτε ένα byte, πώς μπορεί να αποδειχθεί ότι το αντικείμενο υπήρχε; Οπότε 1 byte δίνεται εδώ καθαρά για τον προσδιορισμό του placeholder της ύπαρξης του αντικειμένου.

4. αυτόν τον δείκτη

Χαρακτηριστικά αυτού του δείκτη

Υπάρχουν δύο συναρτήσεις μέλους, Init και Print, στην κλάση Date Δεν υπάρχει διάκριση μεταξύ διαφορετικών αντικειμένων στο σώμα της συνάρτησης. Έτσι, όταν το d1 καλεί τις συναρτήσεις Init και Print, πώς γνωρίζει η συνάρτηση εάν πρέπει να έχει πρόσβαση στο αντικείμενο d1. το αντικείμενο d2;Τότε εδώ θα δούμε ότι η C++ δίνει έναν σιωπηρό αυτόν τον δείκτη για να λύσει το πρόβλημα εδώ.

• Μετά τη μεταγλώττιση του μεταγλωττιστή, οι συναρτήσεις μέλους της κλάσης θα προσθέσουν έναν δείκτη του τρέχοντος τύπου κλάσης, που ονομάζεται αυτός ο δείκτης, στην πρώτη θέση της επίσημης παραμέτρου από προεπιλογή. Για παράδειγμα, το πραγματικό πρωτότυπο της κλάσης Init of Date είναι,void Init(Date* const this, int year, int month, int day) • Κατά την πρόσβαση σε μεταβλητές μέλους σε συναρτήσεις μέλους κλάσης, ουσιαστικά η πρόσβαση σε αυτές γίνεται μέσω αυτού του δείκτη, για παράδειγμα, κατά την εκχώρηση τιμής στο _year στη συνάρτηση Init -&gt;_έτος = έτος;

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

  1. #include<iostream>
  2. using namespace std;
  3. class Date
  4. {
  5. public:
  6. // void Init(Date* const this, int year, int month, int day)
  7. void Init(int year, int month, int day)
  8. {
  9. // 编译报错:error C2106: “=”: 左操作数必须为左值
  10. // this = nullptr;
  11. // this->_year = year;
  12. _year = year;
  13. this->_month = month;
  14. this->_day = day;
  15. }
  16. void Print()
  17. {
  18. cout << _year << "/" << _month << "/" << _day << endl;
  19. }
  20. private:
  21. // 这⾥只是声明,没有开空间
  22. int _year;
  23. int _month;
  24. int _day;
  25. };
  26. int main()
  27. {
  28. // Date类实例化出对象d1和d2
  29. Date d1;
  30. Date d2;
  31. d1.Init(2024, 7, 1); // d1.Init(&d1, 2024, 7, 1);
  32. d1.Print(); // d1.Print(&d1);
  33. d2.Init(2024, 7, 10); // d2.Init(&d2, 2024, 7, 10);
  34. d2.Print(); // d2.Print(&d2);
  35. return 0;
  36. }