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

Γ βασικά (2)

2024-07-12

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

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

1. Τάξεις και αντικείμενα

1.1 Ορισμός τάξης

1.2 Πρόσβαση σε προκριματικά

1.3 Τομέας κλάσης

2. Instantiation

2.1 Έννοια Instantiation

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

3.αυτός ο δείκτης

4.Προεπιλεγμένες συναρτήσεις μέλους κλάσεων

4.1 Κατασκευαστής

4.2 Καταστροφέας

4.5 Υπερφόρτωση χειριστή


1. Τάξεις και αντικείμενα

1.1 Ορισμός τάξης

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

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

  1. //text.cpp
  2. #include<iostream>
  3. using namespace std;
  4. class Stack
  5. {
  6. //成员变量
  7. int* a;
  8. int top;
  9. int capacity;
  10. //成员函数
  11. void Push()
  12. {
  13. }
  14. void Pop()
  15. {
  16. }
  17. };//分号不能省略
  18. int main()
  19. {
  20. return 0;
  21. }

  • Για να διακρίνουμε τις μεταβλητές μέλους, είναι γενικά σύνηθες να προσθέτουμε ένα ειδικό αναγνωριστικό στη μεταβλητή μέλους, όπως να ξεκινάμε με _ ή m_ πριν ή μετά τη μεταβλητή μέλους.Δεν υπάρχουν κανονισμοί για αυτήν τη σύνταξη C++, είναι απλώς θέμα προσωπικής ή εταιρικής προτίμησης.
  1. //为区分成员变量,一般前面加_
  2. //成员变量
  3. int* _a;
  4. int _top;
  5. int _capacity;
  • Η δομή στη C++ μπορεί επίσης να ορίσει κλάσεις Η C++ είναι συμβατή με τη χρήση της δομής σε C. Ταυτόχρονα, η δομή έχει αναβαθμιστεί σε μια κλάση εξακολουθεί να προτείνει τη χρήση κλάσης για τον ορισμό κλάσεων.

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

1.2 Πρόσβαση σε προκριματικά

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

  • Τα μέλη που τροποποιούνται από δημόσιο (δημόσιο) μπορούν να έχουν άμεση πρόσβαση εκτός της τάξης, τα μέλη που τροποποιούνται από προστατευμένα (προστατευμένα) και ιδιωτικά (ιδιωτικά) δεν μπορούν να έχουν άμεση πρόσβαση εκτός της κλάσης, τα προστατευόμενα και ιδιωτικά είναι τα ίδια
  • Το εύρος της άδειας πρόσβασης ξεκινά από τη θέση όπου εμφανίζεται το δικαίωμα πρόσβασης έως ότου εμφανιστεί ο επόμενος προσδιοριστής πρόσβασης, το πεδίο εφαρμογής τελειώνει στο }, το οποίο είναι το τέλος της κλάσης.
  1. //text.cpp
  2. #include<iostream>
  3. using namespace std;
  4. class Stack
  5. {
  6. ///
  7. void Push()
  8. {
  9. }
  10. //Push 没给限定符 class默认私有 private
  11. ///
  12. public:
  13. void Pop()
  14. {
  15. }
  16. int Swap()
  17. {
  18. }
  19. //Pop和Swap 被public修饰,直到下一个限定符出现之前都为公有
  20. ///
  21. protected:
  22. int add();
  23. //add 被public修饰,直到下一个限定符出现之前都为保护
  24. /// /
  25. private:
  26. int* _a;
  27. int _top;
  28. int _capacity;
  29. //成员变量被private修饰,直到}结束都为私有
  30. };
  31. int main()
  32. {
  33. Stack st;
  34. //公有可以访问
  35. st.Pop();
  36. st.Swap();
  37. //私有不可访问
  38. st._top;
  39. return 0;
  40. }

Επιπρόσθετες σημειώσεις:

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

1.3 Τομέας κλάσης

Η κλάση ορίζει ένα νέο εύρος.

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

  1. //text.cpp
  2. #include<iostream>
  3. using namespace std;
  4. class Stack
  5. {
  6. public:
  7. void Init(int x, int y);
  8. };
  9. void Stack::Init(int x, int y)
  10. {
  11. _top = x;
  12. _capacity = y;
  13. }
  14. int main()
  15. {
  16. return 0;
  17. }

Ειδοποίηση:

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

2. Instantiation

2.1 Έννοια Instantiation

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

  1. //text.cpp
  2. #include<iostream>
  3. using namespace std;
  4. class Stack
  5. {
  6. //声明
  7. int* _a;
  8. int _top;
  9. int _capacity;
  10. };
  11. int main()
  12. {
  13. Stack::_top = 2024;
  14. //编译器报错,_top只是声明,并未实例化
  15. return 0;
  16. }
  • Μια κλάση μπορεί να δημιουργήσει πολλαπλά αντικείμενα και τα στιγμιοποιημένα αντικείμενα καταλαμβάνουν πραγματικό φυσικό χώρο και αποθηκεύουν μεταβλητές μελών. Για παράδειγμα: η δημιουργία αντικειμένων από μια τάξη είναι σαν τη χρήση σχεδίων αρχιτεκτονικού σχεδιασμού για την κατασκευή ενός σπιτιού στην πραγματικότητα. Τα σχέδια σχεδίασης σχεδιάζουν τον αριθμό των δωματίων, το μέγεθος του σπιτιού, κ.λπ κτίριο, και δεν μπορεί Για να ζήσει σε ανθρώπους, μόνο όταν ένα σπίτι χτίζεται χρησιμοποιώντας τα σχέδια σχεδιασμού μπορούν οι άνθρωποι να ζουν στο σπίτι.Η ίδια κλάση είναι σαν ένα σχέδιο σχεδίασης Απλώς λέει στον μεταγλωττιστή πόση μνήμη πρόκειται να ανοίξει, αλλά δεν ανοίγει τη μνήμη μόνο στα στιγμιότυπα αντικείμενα.
    1. //text.cpp
    2. #include<iostream>
    3. using namespace std;
    4. class Stack
    5. {
    6. //声明
    7. int* _a;
    8. int _top;
    9. int _capacity;
    10. };
    11. int main()
    12. {
    13. Stack st;
    14. st._top=2024;
    15. //Stack实例化出st,系统已经给st分配内存了,可以存储数据,编译通过
    16. return 0;
    17. }

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

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

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

  • Το πρώτο μέλος βρίσκεται στη μετατόπιση διεύθυνσης 0 από τη δομή
  • Άλλες μεταβλητές μελών πρέπει να ευθυγραμμίζονται σε διευθύνσεις που είναι πολλαπλάσια του αριθμού στοίχισης.
  • Αριθμός στοίχισης = Ο μικρότερος από τον προεπιλεγμένο αριθμό στοίχισης του μεταγλωττιστή και το μέγεθος του μέλους
  • Ο προεπιλεγμένος αριθμός ευθυγράμμισης της πλατφόρμας VS x64 είναι 4 και ο προεπιλεγμένος αριθμός ευθυγράμμισης του x86 είναι 8
  • Το συνολικό μέγεθος της δομής είναι: ένα ακέραιο πολλαπλάσιο του μέγιστου αριθμού στοίχισης (η μεγαλύτερη από όλες τις μεταβλητές τύπου και ο μικρότερος προεπιλεγμένος αριθμός στοίχισης)
  • Εάν οι δομές είναι ένθετες, η ένθετη δομή ευθυγραμμίζεται σε ένα ακέραιο πολλαπλάσιο του δικού της μέγιστου αριθμού στοίχισης και το συνολικό μέγεθος της δομής είναι ένα ακέραιο πολλαπλάσιο όλων των μέγιστων αριθμών στοίχισης (συμπεριλαμβανομένου του αριθμού στοίχισης των ένθετων δομών)
  1. class A
  2. {
  3. public:
  4. void Print()
  5. {
  6. cout << _ch << endl;
  7. }
  8. private:
  9. char _ch;
  10. int _i;
  11. };
  12. //_ch 是一个字节,默认对齐数是4,最大对齐数是4,所以开辟4个字节用来存在_ch
  13. // _i是4个字节,默认对齐数是4,最大对齐数是4,所以开辟4个字节用来存储_i
  14. class B
  15. {
  16. public:
  17. void Print()
  18. {
  19. //。。。
  20. }
  21. };
  22. class B
  23. {
  24. };
  25. //B和C里面没有存储任何成员变量,只有一个函数,可成员函数不存对象里面
  26. // 按理来说是0,但是结构体怎么会没大小,为表示对象存在C++对这种规定大小为1,为了占位标识对象存在

3.αυτός ο δείκτης

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

Για παράδειγμα, το πρωτότυπο Init στην κλάση Date είναι άκυρο Init (Ημερομηνία * περιλαμβάνει αυτό, int έτος, int μήνα, int ημέρα Κατά την πρόσβαση σε μεταβλητές μέλους στις συναρτήσεις μέλους της κλάσης, η essence προσεγγίζεται μέσω αυτού του δείκτη). όπως _year στη συνάρτηση Init, this-&gt;_year=year

πρωτότυπο:

  1. class Date
  2. {
  3. void Print()
  4. {
  5. cout << _year << "n" << _month << "n" << _day << endl;
  6. }
  7. void Init( int year, int month,int day)
  8. {
  9. _year = year;
  10. _month = month;
  11. _day = day;
  12. }
  13. private:
  14. int _year;
  15. int _month;
  16. int _day;
  17. };

  1. Date d1;
  2. d1.Init(2024,7,10);
  3. d1.Print();
  4. Date d2;
  5. d2.Init(2024, 7, 9);
  6. d2.Print();

πραγματικό πρωτότυπο

  1. class Date
  2. {
  3. void Init(Date* const this,int year, int month,int day)
  4. {
  5. this->_year = year;
  6. this->_month = month;
  7. this->_day = day;
  8. }
  9. void Printf(Date* const this)
  10. {
  11. cout << this->_year << "n" <<this-> _month << "n" << this->_day << endl;
  12. }
  13. private:
  14. int _year;
  15. int _month;
  16. int _day;
  17. };

  1. Date d1;
  2. d1.Init(&d1,2024,7,10);
  3. d1.Print(&d1);
  4. Date d2;
  5. d2.Init(&d2,2024, 7, 9);
  6. d2.Print();

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

αυτός ο δείκτης αποθηκεύεται στη στοίβα

4.Προεπιλεγμένες συναρτήσεις μέλους κλάσεων

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

4.1 Κατασκευαστής

Ο κατασκευαστής είναι μια ειδική συνάρτηση μέλους Θα πρέπει να σημειωθεί ότι παρόλο που ο κατασκευαστής ονομάζεται κατασκευαστής, το κύριο περιεχόμενο του κατασκευαστή δεν είναι να ανοίξει χώρο για τη δημιουργία αντικειμένων (το τοπικό αντικείμενο που συνήθως χρησιμοποιούμε είναι ο χώρος που ανοίγει. δημιουργείται το πλαίσιο στοίβας) ), αλλά το αντικείμενο αρχικοποιείται όταν το αντικείμενο είναι στιγμιότυπο. Η ουσία του κατασκευαστή είναι να αντικαταστήσει τη συνάρτηση Init που γράψαμε στις κλάσεις Stack και Date πριν. Η αυτόματη κλήση του κατασκευαστή αντικαθιστά τέλεια τη συνάρτηση Init.

Χαρακτηριστικά του κατασκευαστή:

  1. Το όνομα της συνάρτησης είναι το ίδιο με το όνομα της κλάσης
  2. Χωρίς επιστροφή τιμής (δεν χρειάζεται να δώσετε τίποτα ως επιστρεφόμενη τιμή και μην γράψετε void. Αυτός είναι ο κανόνας της C++)
  3. Όταν δημιουργηθεί το αντικείμενο, το σύστημα θα καλέσει αυτόματα τον αντίστοιχο κατασκευαστή.
  4. Οι κατασκευαστές μπορεί να υπερφορτωθούν
  5. Εάν δεν υπάρχει ορισμένος ρητός κατασκευαστής στην κλάση, ο μεταγλωττιστής C++ θα δημιουργήσει αυτόματα έναν προεπιλεγμένο κατασκευαστή χωρίς παραμέτρους Μόλις ο χρήστης ορίσει ρητά τον κατασκευαστή, ο μεταγλωττιστής δεν θα τον δημιουργεί πλέον.

  1. class Date
  2. {public:
  3. //1.无参构造函数
  4. Date()
  5. {
  6. _year = 1;
  7. _month = 1;
  8. _day = 1;
  9. }
  10. //2.带参构造函数
  11. Date(int year, int month, int day)
  12. {
  13. _year = year;
  14. _month = month;
  15. _day = day;
  16. }
  17. //3.全缺省构造函数
  18. Date(int year = 1, int month = 1, int day = 1)
  19. {
  20. _year = year;
  21. _month = month;
  22. _day = day;
  23. }
  24. private:
  25. int _year;
  26. int _month;
  27. int _day;
  28. };

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

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

  1. //text.cpp
  2. #include<iostream>
  3. using namespace std;
  4. typedef int STDataType;
  5. class Stack
  6. {
  7. public:
  8. Stack(int n = 4)
  9. {
  10. _a = (STDataType*)malloc(sizeof(STDataType) * n);
  11. if (nullptr == _a)
  12. {
  13. perror("malloc申请失败");
  14. }
  15. _capacity = n;
  16. _top = 0;
  17. }
  18. private:
  19. STDataType* _a;
  20. size_t _capacity;
  21. size_t _top;
  22. };
  23. //两个Stack实现队列
  24. class MyQueue
  25. {
  26. private:
  27. int size;
  28. Stack pushst;
  29. Stack popst;
  30. };
  31. int main()
  32. {
  33. MyQueue my;
  34. return 0;
  35. }

Η C++ διαιρεί τους τύπους σε προσαρμοσμένους τύπους και ενσωματωμένους τύπους (βασικούς τύπους). Οι ενσωματωμένοι τύποι είναι οι εγγενείς τύποι δεδομένων που παρέχονται από τη γλώσσα, όπως int/char/double/pointer κ.λπ. Οι προσαρμοσμένοι τύποι είναι τύποι που ορίζουμε μόνοι μας χρησιμοποιώντας λέξεις-κλειδιά όπως class/struct.Ο κατασκευαστής εδώ αρχικοποιείται αυτόματα και το VS προετοιμάζει επίσης το μέγεθος του ενσωματωμένου τύπου Διαφορετικοί μεταγλωττιστές έχουν διαφορετικές τιμές αρχικοποίησης και η C++ δεν τις καθορίζει.

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

Περίληψη: Στις περισσότερες περιπτώσεις, πρέπει να υλοποιήσουμε τον κατασκευαστή μόνοι μας. Σε λίγες περιπτώσεις, είναι παρόμοιο με το MyQueue και όταν το Stack έχει έναν προεπιλεγμένο κατασκευαστή, το MyQueue μπορεί να δημιουργηθεί και να χρησιμοποιηθεί αυτόματα.

4.2 Καταστροφέας

  1. ~Stack()
  2. {
  3. free(_a);
  4. _a = nullptr;
  5. _top = _capacity = 0;
  6. }

Χαρακτηριστικά του καταστροφέα:

1. Το όνομα του καταστροφέα προηγείται από χαρακτήρες~

2. Χωρίς παραμέτρους και χωρίς επιστρεφόμενη τιμή (σύμφωνα με τον κατασκευαστή)

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

4. Όταν τελειώσει ο κύκλος δήλωσης αντικειμένων, το σύστημα θα καλέσει αυτόματα τον καταστροφέα.

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

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

  1. //text.cpp
  2. #include<iostream>
  3. using namespace std;
  4. typedef int STDataType;
  5. class Stack
  6. {
  7. public:
  8. Stack(int n = 4)
  9. {
  10. _a = (STDataType*)malloc(sizeof(STDataType) * n);
  11. if (nullptr == _a)
  12. {
  13. perror("malloc申请失败");
  14. }
  15. _capacity = n;
  16. _top = 0;
  17. }
  18. ~Stack()
  19. {
  20. free(_a);
  21. _a = nullptr;
  22. _top=_capacity=0;
  23. }
  24. private:
  25. STDataType* _a;
  26. size_t _capacity;
  27. size_t _top;
  28. };
  29. //两个Stack实现队列
  30. class MyQueue
  31. {public:
  32. //编译器默认生成MyQueue的构造函数调用了Stack的构造,完成了两个成员的初始化
  33. //编译器默认生成MyQueue的析构函数调用了Stack的析构,释放了Stack内部的资源
  34. //显示写析构也会调用Stack的析构
  35. ~MyQueue()
  36. {
  37. cout << "~MyQueue" << endl;
  38. }
  39. private:
  40. Stack pushst;
  41. Stack popst;
  42. };
  43. int main()
  44. {
  45. MyQueue my;
  46. return 0;
  47. }

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

Εάν δεν ζητηθούν πόροι, ο καταστροφέας δεν χρειάζεται να γραφτεί και ο προεπιλεγμένος καταστροφέας που δημιουργείται από τον μεταγλωττιστή μπορεί να χρησιμοποιηθεί απευθείας, όπως η ημερομηνία όπως το MyQueue, αλλά υπάρχει μια εφαρμογή πόρων Κατά την καταστροφή, φροντίστε να γράψετε απευθείας τον καταστροφέα, διαφορετικά θα προκαλέσει διαρροή πόρων, όπως το Stack

4.5 Υπερφόρτωση χειριστή

  • Όταν χρησιμοποιούνται τελεστές σε πληκτρολογημένα αντικείμενα, η γλώσσα C++ μας επιτρέπει να καθορίσουμε νέες έννοιες με τη μορφή υπερφόρτωσης τελεστή. Η C++ ορίζει ότι όταν ένα αντικείμενο τύπου κλάσης χρησιμοποιεί έναν τελεστή, πρέπει να μετατραπεί σε κλήση στον αντίστοιχο τελεστή υπερφόρτωσης, εάν όχι, ο μεταγλωττιστής θα αναφέρει ένα σφάλμα.
  • Η υπερφόρτωση τελεστή είναι μια συνάρτηση με συγκεκριμένο όνομα Το όνομά της αποτελείται από τον τελεστή και τον τελεστή που θα οριστεί αργότερα.Όπως και άλλες συναρτήσεις, έχει επίσης τον τύπο επιστροφής και τη λίστα παραμέτρων, καθώς και ένα σώμα συνάρτησης
  1. bool operator<(Date d1, Date d2)
  2. {
  3. }
  4. bool operator==(Date d1,Date d2)
  5. {
  6. return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
  7. }
  • Μια υπερφορτωμένη συνάρτηση χειριστή παίρνει τόσες παραμέτρους όσες και τις παραμέτρους στις οποίες ενεργεί ο χειριστής.Η άνεση μεταφοράς έχει μία παράμετρο και ο δυαδικός τελεστής έχει δύο παραμέτρους Ο αριστερός τελεστής του δυαδικού τελεστή μεταβιβάζεται στην πρώτη παράμετρο και ο δεξιός τελεστής στη δεύτερη παράμετρο.
  1. //text.cpp
  2. #include<iostream>
  3. using namespace std;
  4. class Date
  5. {
  6. public:
  7. Date(int year, int month, int day)
  8. {
  9. _year= year;
  10. _month = month;
  11. _day = day;
  12. }
  13. int _year;
  14. int _month;
  15. int _day;
  16. };
  17. bool operator<(Date d1, Date d2)
  18. {
  19. }
  20. bool operator==(Date d1,Date d2)
  21. {
  22. return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
  23. }
  24. int main()
  25. {
  26. Date d1(2024, 7, 10);
  27. Date d2(2024,7,9);
  28. //两种用法都可以
  29. d1 == d2;
  30. operator==(d1 , d2);
  31. return 0;
  32. }
  • Εάν μια υπερφορτωμένη συνάρτηση τελεστή είναι μια συνάρτηση μέλους, ο πρώτος της τελεστής μεταβιβάζεται στον σιωπηρό αυτό το δείκτη από προεπιλογή. Επομένως, όταν ο τελεστής είναι υπερφορτωμένος ως συνάρτηση μέλους, έχει μια παράμετρο λιγότερο από τον τελεστή.
  • Μετά την υπερφόρτωση ενός χειριστή, η προτεραιότητα και η συσχέτισή του παραμένουν συνεπείς με τις λειτουργίες του ενσωματωμένου τύπου.
  • Δεν μπορείτε να δημιουργήσετε έναν σεξουαλικό τελεστή συνενώνοντας αντιστοιχίσεις που δεν υπάρχουν στη σύνταξη: π.χ. operator@.