informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Daftar isi
4.Fungsi anggota kelas default
Format definisi kelas
class adalah kata kunci yang mendefinisikan kelas, Stack adalah nama kelas, dan {} adalah isi kelas. Perhatikan bahwa titik koma di akhir definisi tidak dihilangkan. Isi badan kelas disebut anggota kelas: variabel dalam kelas disebut atribut atau variabel anggota fungsi kelas dalam kelas disebut metode atau fungsi anggota kelas;
- //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++ adalah cara untuk mengimplementasikan enkapsulasi, menggunakan kelas untuk menggabungkan properti dan metode suatu objek untuk membuat objek lebih lengkap, dan secara selektif menyediakan antarmukanya kepada pengguna eksternal melalui hak akses.
- //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;
- }
Catatan tambahan:
Kelas mendefinisikan cakupan baru. Semua anggota kelas berada dalam cakupan kelas. Saat mendefinisikan anggota di luar kelas, Anda perlu menggunakan operator ::scope untuk menunjukkan cakupan kelas mana yang dimiliki anggota tersebut.
Domain kelas mempengaruhi aturan pencarian kompilasi. Jika Init dalam program berikut tidak menentukan domain kelas Stack, kompiler akan memperlakukan Init sebagai fungsi global. Jika tidak dapat menemukan anggota seperti _top selama kompilasi, ia akan menuju ke domain kelas untuk menemukannya.
- //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;
- }
Melihat:
- //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;
- }
-
-
Aturan penyelarasan memori
- 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,为了占位标识对象存在
Setelah kompiler dikompilasi, fungsi anggota kelas akan menambahkan pointer ke kelas saat ini di posisi pertama parameter formal secara default, yang disebut pointer ini.
Misalnya, prototipe Init di kelas Tanggal adalah void Init (Tanggal * const ini, int tahun, int bulan, int hari). Saat mengakses variabel anggota di fungsi anggota kelas, esensi diakses melalui penunjuk ini, seperti _tahun dalam fungsi Init, ini->_tahun=tahun
prototipe:
- 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();
-
prototipe nyata
- 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++ menetapkan bahwa tidak diperbolehkan untuk menulis pointer ini pada posisi parameter aktual dan parameter formal (kompiler akan menanganinya saat kompilasi), tetapi pointer ini dapat digunakan secara eksplisit di badan fungsi konten yang ditunjuk oleh penunjuk ini bisa
penunjuk ini disimpan di tumpukan
Fungsi anggota default adalah fungsi anggota yang tidak ditentukan secara eksplisit oleh pengguna dan secara otomatis dihasilkan oleh kompiler.
Konstruktor adalah fungsi anggota khusus. Perlu dicatat bahwa meskipun konstruktor disebut konstruktor, isi utama konstruktor bukanlah membuka ruang untuk membuat objek (objek lokal yang biasa kita gunakan adalah ruang yang dibuka ketika bingkai tumpukan dibuat) ), tetapi objek diinisialisasi saat objek dipakai. Inti dari konstruktor adalah menggantikan fungsi fungsi Init yang kita tulis di kelas Stack dan Date sebelumnya. Pemanggilan otomatis konstruktor dengan sempurna menggantikan fungsi Init.
Fitur konstruktor:
- 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;
-
- };
Konstruktor tanpa argumen, konstruktor default, dan konstruktor yang dihasilkan oleh kompiler secara default ketika kita tidak menulis konstruktor semuanya disebut konstruktor default. Tapi hanya satu dari ketiganya yang bisa eksis, tidak pada waktu yang bersamaan. Meskipun konstruktor tanpa parameter dan konstruktor default penuh merupakan fungsi yang kelebihan beban, akan ada ambiguitas saat memanggilnya.Perhatikan bahwa tidak hanya konstruktor default yang dihasilkan oleh kompiler secara default, tetapi juga konstruktor, konstruktor tanpa parameter, dan konstruktor default penuh juga merupakan konstruktor default.
Kami tidak menulisnya. Konstruk yang dihasilkan oleh kompiler secara default tidak memiliki persyaratan untuk inisialisasi variabel anggota tipe bawaan. Artinya, apakah diinisialisasi atau tidak tidak pasti, itu tergantung pada kompiler.
- //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++ membagi tipe menjadi tipe khusus dan tipe bawaan (tipe dasar). Tipe bawaan adalah tipe data asli yang disediakan oleh bahasa, seperti int/char/double/pointer, dll. Tipe khusus adalah tipe yang kita definisikan sendiri menggunakan kata kunci seperti class/struct.Konstruktor di sini secara otomatis diinisialisasi, dan VS juga menginisialisasi ukuran tipe bawaan. Kompiler yang berbeda memiliki nilai inisialisasi yang berbeda, dan C++ tidak menentukannya.
Untuk variabel anggota tipe khusus, diperlukan untuk memanggil konstruktor default variabel anggota ini untuk menginisialisasinya.Jika variabel anggota ini tidak memiliki konstruktor default, kesalahan akan dilaporkan. Jika kita ingin menginisialisasi variabel anggota ini, kita perlu menggunakan daftar inisialisasi untuk menyelesaikannya.
Ringkasan: Dalam kebanyakan kasus, kita perlu mengimplementasikan konstruktornya sendiri. Dalam beberapa kasus, ini mirip dengan MyQueue dan ketika Stack memiliki konstruktor default, MyQueue dapat dibuat dan digunakan secara otomatis.
- ~Stack()
- {
- free(_a);
- _a = nullptr;
- _top = _capacity = 0;
- }
Karakteristik destruktor:
1. Nama destruktor diawali dengan karakter~
2. Tidak ada parameter dan tidak ada nilai kembalian (konsisten dengan konstruktor)
3. Sebuah kelas hanya dapat memiliki satu destruktor.Jika definisi tidak ditampilkan, sistem akan secara otomatis menghasilkan destruktor default.
4. Ketika siklus deklarasi objek berakhir, sistem akan secara otomatis memanggil destruktor.
5. Mirip dengan konstruktor, kami tidak menulis destruktor yang dihasilkan secara otomatis oleh kompiler dan tidak memproses anggota tipe bawaan. Anggota tipe khusus akan memanggil destruktor lain.
6. Perlu juga dicatat bahwa ketika kita menampilkan destruktor, destruktor dari anggota tipe khusus juga akan dipanggil, yang berarti bahwa destruktor dari anggota tipe khusus akan dipanggil secara otomatis apa pun situasinya.
- //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;
- }
Destruktor di MyQueue tidak melakukan apa pun, tetapi C++ menetapkan bahwa destruktor lain akan dipanggil untuk melepaskan memori.
Jika tidak ada sumber daya yang diminta, destruktor tidak perlu ditulis, dan destruktor default yang dihasilkan oleh kompiler dapat digunakan secara langsung, seperti Tanggal. Jika destruktor default yang dihasilkan dapat digunakan, tidak perlu menulis destruktor secara eksplisit seperti MyQueue, tetapi ada aplikasi sumber daya. Saat melakukan penghancuran, pastikan untuk menulis destruktor secara langsung, jika tidak maka akan menyebabkan kebocoran sumber daya seperti 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;
- }