τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Πίνακας περιεχομένων
4.Προεπιλεγμένες συναρτήσεις μέλους κλάσεων
Μορφή ορισμού τάξης
class είναι η λέξη-κλειδί που ορίζει την κλάση, Stack είναι το όνομα της κλάσης και {} είναι το σώμα της κλάσης Σημειώστε ότι το ερωτηματικό στο τέλος του ορισμού δεν παραλείπεται. Τα περιεχόμενα στο σώμα της κλάσης ονομάζονται μέλη της κλάσης: οι μεταβλητές της κλάσης ονομάζονται χαρακτηριστικά ή οι μεταβλητές μέλους της κλάσης ονομάζονται μέθοδοι ή συναρτήσεις μέλους της κλάσης.
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
- //成员变量
- int* a;
- int top;
- int capacity;
- //成员函数
- void Push()
- {
-
- }
- void Pop()
- {
-
- }
- };//分号不能省略
- int main()
- {
-
-
- return 0;
- }
- //为区分成员变量,一般前面加_
- //成员变量
- int* _a;
- int _top;
- int _capacity;
Η C++ είναι ένας τρόπος υλοποίησης της ενθυλάκωσης, χρησιμοποιώντας κλάσεις για να συνδυάσουν τις ιδιότητες και τις μεθόδους ενός αντικειμένου για να γίνει το αντικείμενο πιο ολοκληρωμένο και να παρέχει επιλεκτικά τη διεπαφή του σε εξωτερικούς χρήστες μέσω δικαιωμάτων πρόσβασης.
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
-
- ///
-
- void Push()
- {
-
- }
- //Push 没给限定符 class默认私有 private
- ///
- public:
- void Pop()
- {
-
- }
- int Swap()
- {
-
- }
- //Pop和Swap 被public修饰,直到下一个限定符出现之前都为公有
- ///
- protected:
- int add();
- //add 被public修饰,直到下一个限定符出现之前都为保护
- /// /
-
- private:
-
- int* _a;
- int _top;
- int _capacity;
- //成员变量被private修饰,直到}结束都为私有
- };
- int main()
- {
- Stack st;
- //公有可以访问
- st.Pop();
- st.Swap();
- //私有不可访问
- st._top;
-
-
-
- return 0;
- }
Επιπρόσθετες σημειώσεις:
Η κλάση ορίζει ένα νέο εύρος.
Ο τομέας της κλάσης επηρεάζει τους κανόνες αναζήτησης μεταγλώττισης Εάν το Init στο ακόλουθο πρόγραμμα δεν καθορίζει τον τομέα της κλάσης Stack, ο μεταγλωττιστής θα μεταχειριστεί το Init ως μια καθολική συνάρτηση εάν δεν μπορεί να βρει μέλη όπως _top κατά τη μεταγλώττιση τομέα κατηγορίας για να τα βρείτε.
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
-
- public:
- void Init(int x, int y);
-
- };
- void Stack::Init(int x, int y)
-
- {
- _top = x;
- _capacity = y;
- }
- int main()
- {
-
- return 0;
- }
Ειδοποίηση:
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
- //声明
-
- int* _a;
- int _top;
- int _capacity;
-
- };
-
- int main()
- {
-
- Stack::_top = 2024;
- //编译器报错,_top只是声明,并未实例化
-
- return 0;
- }
-
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
-
- //声明
- int* _a;
- int _top;
- int _capacity;
-
- };
-
- int main()
- {
-
-
- Stack st;
- st._top=2024;
- //Stack实例化出st,系统已经给st分配内存了,可以存储数据,编译通过
-
- return 0;
- }
-
-
Κανόνες ευθυγράμμισης μνήμης
- class A
- {
- public:
- void Print()
- {
- cout << _ch << endl;
- }
- private:
- char _ch;
-
- int _i;
- };
- //_ch 是一个字节,默认对齐数是4,最大对齐数是4,所以开辟4个字节用来存在_ch
- // _i是4个字节,默认对齐数是4,最大对齐数是4,所以开辟4个字节用来存储_i
- class B
- {
- public:
- void Print()
- {
- //。。。
- }
-
-
- };
- class B
- {
-
-
- };
- //B和C里面没有存储任何成员变量,只有一个函数,可成员函数不存对象里面
- // 按理来说是0,但是结构体怎么会没大小,为表示对象存在C++对这种规定大小为1,为了占位标识对象存在
Μετά τη μεταγλώττιση του μεταγλωττιστή, οι συναρτήσεις μέλους της κλάσης θα προσθέσουν έναν δείκτη στην τρέχουσα κλάση στην πρώτη θέση της επίσημης παραμέτρου από προεπιλογή, που ονομάζεται αυτός ο δείκτης.
Για παράδειγμα, το πρωτότυπο Init στην κλάση Date είναι άκυρο Init (Ημερομηνία * περιλαμβάνει αυτό, int έτος, int μήνα, int ημέρα Κατά την πρόσβαση σε μεταβλητές μέλους στις συναρτήσεις μέλους της κλάσης, η essence προσεγγίζεται μέσω αυτού του δείκτη). όπως _year στη συνάρτηση Init, this->_year=year
πρωτότυπο:
- class Date
- {
- void Print()
- {
-
- cout << _year << "n" << _month << "n" << _day << endl;
- }
- void Init( int year, int month,int day)
- {
- _year = year;
- _month = month;
- _day = day;
-
- }
-
- private:
- int _year;
- int _month;
- int _day;
-
- };
-
- Date d1;
- d1.Init(2024,7,10);
-
- d1.Print();
- Date d2;
-
- d2.Init(2024, 7, 9);
- d2.Print();
-
πραγματικό πρωτότυπο
- class Date
- {
- void Init(Date* const this,int year, int month,int day)
-
- {
- this->_year = year;
- this->_month = month;
- this->_day = day;
-
- }
- void Printf(Date* const this)
-
- {
-
- cout << this->_year << "n" <<this-> _month << "n" << this->_day << endl;
- }
- private:
- int _year;
- int _month;
- int _day;
-
- };
- Date d1;
- d1.Init(&d1,2024,7,10);
- d1.Print(&d1);
-
- Date d2;
- d2.Init(&d2,2024, 7, 9);
- d2.Print();
Η C++ ορίζει ότι δεν επιτρέπεται η εγγραφή αυτού του δείκτη στη θέση των πραγματικών παραμέτρων και των τυπικών παραμέτρων (ο μεταγλωττιστής θα τον χειριστεί κατά τη μεταγλώττιση), αλλά αυτός ο δείκτης μπορεί να χρησιμοποιηθεί ρητά στο σώμα της συνάρτησης περιεχόμενο που επισημαίνεται από αυτόν τον δείκτη μπορεί
αυτός ο δείκτης αποθηκεύεται στη στοίβα
Η προεπιλεγμένη συνάρτηση μέλους είναι μια συνάρτηση μέλους που δεν ορίζεται ρητά από τον χρήστη και δημιουργείται αυτόματα από τον μεταγλωττιστή.
Ο κατασκευαστής είναι μια ειδική συνάρτηση μέλους Θα πρέπει να σημειωθεί ότι παρόλο που ο κατασκευαστής ονομάζεται κατασκευαστής, το κύριο περιεχόμενο του κατασκευαστή δεν είναι να ανοίξει χώρο για τη δημιουργία αντικειμένων (το τοπικό αντικείμενο που συνήθως χρησιμοποιούμε είναι ο χώρος που ανοίγει. δημιουργείται το πλαίσιο στοίβας) ), αλλά το αντικείμενο αρχικοποιείται όταν το αντικείμενο είναι στιγμιότυπο. Η ουσία του κατασκευαστή είναι να αντικαταστήσει τη συνάρτηση Init που γράψαμε στις κλάσεις Stack και Date πριν. Η αυτόματη κλήση του κατασκευαστή αντικαθιστά τέλεια τη συνάρτηση Init.
Χαρακτηριστικά του κατασκευαστή:
- class Date
- {public:
- //1.无参构造函数
- Date()
- {
- _year = 1;
- _month = 1;
- _day = 1;
- }
- //2.带参构造函数
- Date(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
-
- //3.全缺省构造函数
- Date(int year = 1, int month = 1, int day = 1)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- private:
- int _year;
- int _month;
- int _day;
-
- };
Ο κατασκευαστής χωρίς παραμέτρους, ο πλήρως προεπιλεγμένος κατασκευαστής και ο κατασκευαστής που δημιουργείται από τον μεταγλωττιστή από προεπιλογή όταν δεν γράφουμε έναν κατασκευαστή ονομάζονται όλοι προεπιλεγμένοι κατασκευαστές. Αλλά μόνο ένα από αυτά τα τρία μπορεί να υπάρχει, όχι ταυτόχρονα. Αν και ο κατασκευαστής χωρίς παραμέτρους και ο πλήρης προεπιλεγμένος κατασκευαστής συνιστούν υπερφόρτωση συναρτήσεων, θα υπάρχει ασάφεια κατά την κλήση τους.Σημειώστε ότι όχι μόνο ο προεπιλεγμένος κατασκευαστής είναι αυτός που δημιουργείται από τον μεταγλωττιστή από προεπιλογή, είναι ο κατασκευαστής, ο κατασκευαστής χωρίς παραμέτρους, και ο πλήρης προεπιλεγμένος κατασκευαστής είναι επίσης ο προεπιλεγμένος κατασκευαστής.
Δεν το γράφουμε Η κατασκευή που δημιουργείται από τον μεταγλωττιστή από προεπιλογή δεν έχει απαιτήσεις για την προετοιμασία των ενσωματωμένων μεταβλητών μελών, δηλαδή, αν είναι αρχικοποιημένη ή όχι, εξαρτάται από τον μεταγλωττιστή.
- //text.cpp
- #include<iostream>
- using namespace std;
- typedef int STDataType;
- class Stack
- {
- public:
- Stack(int n = 4)
- {
- _a = (STDataType*)malloc(sizeof(STDataType) * n);
- if (nullptr == _a)
- {
- perror("malloc申请失败");
- }
- _capacity = n;
- _top = 0;
- }
-
- private:
- STDataType* _a;
- size_t _capacity;
- size_t _top;
- };
- //两个Stack实现队列
- class MyQueue
- {
- private:
- int size;
- Stack pushst;
- Stack popst;
- };
-
- int main()
- {
-
- MyQueue my;
-
-
- return 0;
- }
-
Η C++ διαιρεί τους τύπους σε προσαρμοσμένους τύπους και ενσωματωμένους τύπους (βασικούς τύπους). Οι ενσωματωμένοι τύποι είναι οι εγγενείς τύποι δεδομένων που παρέχονται από τη γλώσσα, όπως int/char/double/pointer κ.λπ. Οι προσαρμοσμένοι τύποι είναι τύποι που ορίζουμε μόνοι μας χρησιμοποιώντας λέξεις-κλειδιά όπως class/struct.Ο κατασκευαστής εδώ αρχικοποιείται αυτόματα και το VS προετοιμάζει επίσης το μέγεθος του ενσωματωμένου τύπου Διαφορετικοί μεταγλωττιστές έχουν διαφορετικές τιμές αρχικοποίησης και η C++ δεν τις καθορίζει.
Για μεταβλητές μέλους προσαρμοσμένου τύπου, απαιτείται να καλέσετε τον προεπιλεγμένο κατασκευαστή αυτής της μεταβλητής μέλους για να την αρχικοποιήσετε.Εάν αυτή η μεταβλητή μέλους δεν έχει προεπιλεγμένο κατασκευαστή, θα αναφερθεί ένα σφάλμα.
Περίληψη: Στις περισσότερες περιπτώσεις, πρέπει να υλοποιήσουμε τον κατασκευαστή μόνοι μας. Σε λίγες περιπτώσεις, είναι παρόμοιο με το MyQueue και όταν το Stack έχει έναν προεπιλεγμένο κατασκευαστή, το MyQueue μπορεί να δημιουργηθεί και να χρησιμοποιηθεί αυτόματα.
- ~Stack()
- {
- free(_a);
- _a = nullptr;
- _top = _capacity = 0;
- }
Χαρακτηριστικά του καταστροφέα:
1. Το όνομα του καταστροφέα προηγείται από χαρακτήρες~
2. Χωρίς παραμέτρους και χωρίς επιστρεφόμενη τιμή (σύμφωνα με τον κατασκευαστή)
3. Μια τάξη μπορεί να έχει μόνο έναν καταστροφέα.Εάν ο ορισμός δεν εμφανίζεται, το σύστημα θα δημιουργήσει αυτόματα έναν προεπιλεγμένο καταστροφέα.
4. Όταν τελειώσει ο κύκλος δήλωσης αντικειμένων, το σύστημα θα καλέσει αυτόματα τον καταστροφέα.
5. Παρόμοια με τον κατασκευαστή, δεν γράφουμε τον καταστροφέα που δημιουργείται αυτόματα από τον μεταγλωττιστή και δεν επεξεργαζόμαστε τα μέλη του ενσωματωμένου τύπου που θα καλούν άλλους καταστροφείς.
6. Πρέπει επίσης να σημειωθεί ότι όταν εμφανίζουμε τον καταστροφέα, θα καλείται και ο καταστροφέας του μέλους προσαρμοσμένου τύπου, που σημαίνει ότι ο καταστροφέας του μέλους προσαρμοσμένου τύπου θα καλείται αυτόματα ανεξάρτητα από την κατάσταση.
- //text.cpp
- #include<iostream>
- using namespace std;
- typedef int STDataType;
- class Stack
- {
- public:
- Stack(int n = 4)
- {
- _a = (STDataType*)malloc(sizeof(STDataType) * n);
- if (nullptr == _a)
- {
- perror("malloc申请失败");
- }
- _capacity = n;
- _top = 0;
-
-
- }
-
- ~Stack()
- {
- free(_a);
- _a = nullptr;
- _top=_capacity=0;
- }
- private:
- STDataType* _a;
- size_t _capacity;
- size_t _top;
-
- };
- //两个Stack实现队列
- class MyQueue
- {public:
- //编译器默认生成MyQueue的构造函数调用了Stack的构造,完成了两个成员的初始化
- //编译器默认生成MyQueue的析构函数调用了Stack的析构,释放了Stack内部的资源
- //显示写析构也会调用Stack的析构
- ~MyQueue()
- {
- cout << "~MyQueue" << endl;
- }
- private:
-
- Stack pushst;
- Stack popst;
-
- };
-
-
- int main()
- {
-
- MyQueue my;
-
-
- return 0;
- }
Ο καταστροφέας στο MyQueue δεν κάνει τίποτα, αλλά η C++ ορίζει ότι άλλοι καταστροφείς θα κληθούν να απελευθερώσουν τη μνήμη.
Εάν δεν ζητηθούν πόροι, ο καταστροφέας δεν χρειάζεται να γραφτεί και ο προεπιλεγμένος καταστροφέας που δημιουργείται από τον μεταγλωττιστή μπορεί να χρησιμοποιηθεί απευθείας, όπως η ημερομηνία όπως το MyQueue, αλλά υπάρχει μια εφαρμογή πόρων Κατά την καταστροφή, φροντίστε να γράψετε απευθείας τον καταστροφέα, διαφορετικά θα προκαλέσει διαρροή πόρων, όπως το Stack
-
-
- bool operator<(Date d1, Date d2)
- {
-
- }
- bool operator==(Date d1,Date d2)
- {
- return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
- }
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year, int month, int day)
- {
- _year= year;
- _month = month;
- _day = day;
-
- }
-
-
-
- int _year;
- int _month;
- int _day;
-
- };
-
- bool operator<(Date d1, Date d2)
- {
-
- }
- bool operator==(Date d1,Date d2)
- {
- return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
- }
- int main()
- {
-
- Date d1(2024, 7, 10);
- Date d2(2024,7,9);
- //两种用法都可以
- d1 == d2;
- operator==(d1 , d2);
- return 0;
- }