2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sisällysluettelo
4. Luokkien oletusjäsenfunktiot
Luokan määritelmän muoto
luokka on avainsana, joka määrittelee luokan, Pino on luokan nimi ja {} on luokan runko. Huomaa, että määritelmän lopussa olevaa puolipistettä ei jätetä pois. Luokan rungon sisältöä kutsutaan luokan jäseniksi: luokan muuttujia kutsutaan attribuuteiksi tai luokan jäsenmuuttujia luokan menetelmiksi tai jäsenfunktioiksi.
- //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++ on tapa toteuttaa kapselointi, jossa luokkien avulla yhdistetään objektin ominaisuuksia ja menetelmiä objektin tekemiseksi täydellisemmäksi ja valikoivasti tarjotaan sen käyttöliittymä ulkoisille käyttäjille käyttöoikeuksien kautta.
- //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;
- }
Lisämerkinnät:
Luokka määrittelee uuden laajuuden. Kaikki luokan jäsenet ovat luokan ulkopuolella.
Luokkatoimialue vaikuttaa kääntämisen hakusääntöihin. Jos seuraavan ohjelman Init ei määritä luokan pinoa, kääntäjä käsittelee Initiä globaalina funktiona. Jos se ei löydä kääntämisen aikana jäseniä, kuten _top, se siirtyy luokan verkkotunnus löytää ne.
- //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;
- }
Ilmoitus:
- //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;
- }
-
-
Muistin kohdistussäännöt
- 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,为了占位标识对象存在
Kun kääntäjä on käännetty, luokan jäsenfunktiot lisäävät osoittimen nykyiseen luokkaan oletusarvoisesti muodollisen parametrin ensimmäiseen kohtaan, jota kutsutaan nimellä tämä osoitin.
Esimerkiksi Date-luokan Init-prototyyppi on void Init (Päivämäärä * const this, int vuosi, int kuukausi, int päivä) Kun päästään jäsenmuuttujiin luokan jäsenfunktioissa, essenssiin päästään tämän osoittimen kautta. kuten _year Init-funktiossa, tämä->_vuosi=vuosi
prototyyppi:
- 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();
-
todellinen prototyyppi
- 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++ määrää, että tätä osoitinta ei saa kirjoittaa todellisten parametrien ja muodollisten parametrien paikkaan (kääntäjä käsittelee sen käännettäessä), mutta tätä osoitinta voidaan käyttää eksplisiittisesti funktion rungossa tämän osoittimen osoittama sisältö voi
tämä osoitin on tallennettu pinoon
Oletusjäsenfunktio on jäsenfunktio, jota käyttäjä ei ole erikseen määritellyt ja jonka kääntäjä luo automaattisesti. Sitä kutsutaan oletusjäsenfunktioksi.
Konstruktori on erityinen jäsenfunktio On huomattava, että vaikka konstruktoria kutsutaan rakentajaksi, konstruktorin pääsisältö ei ole avata tilaa objektien luomiseksi (yleensä käyttämämme paikallinen objekti on tila, joka avataan, kun se avataan. pinokehys luodaan) ), mutta objekti alustetaan, kun objekti instantoidaan. Konstruktorin ydin on korvata aiemmin pino- ja päivämääräluokissa kirjoittamamme Init-funktio. Konstruktorin automaattinen kutsu korvaa täydellisesti Init-funktion.
Rakentajan ominaisuudet:
- 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;
-
- };
Parametritonta rakentajaa, täysin oletuskonstruktoria ja kääntäjän oletusarvoisesti luomaa konstruktoria, kun emme kirjoita konstruktoria, kutsutaan kaikkia oletuskonstruktoreiksi. Mutta vain yksi näistä kolmesta voi olla olemassa, ei samanaikaisesti. Vaikka parametriton konstruktori ja täysi oletuskonstruktori muodostavat funktion ylikuormituksen, niitä kutsuttaessa esiintyy epäselvyyttä.Huomaa, että oletuskonstruktorin lisäksi kääntäjä ei ole oletuksena luonut, vaan se on konstruktori, parametriton konstruktori, ja koko oletuskonstruktori on myös oletuskonstruktori.
Emme kirjoita sitä. Kääntäjän luomalla konstruktilla ei ole oletuksena vaatimuksia sisäänrakennettujen jäsenmuuttujien alustamiselle, eli on epävarmaa, onko se alustettu vai ei, se riippuu kääntäjästä.
- //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++ jakaa tyypit mukautetuiksi tyypeiksi ja sisäänrakennetuiksi tyypeiksi (perustyypit). Sisäänrakennetut tyypit ovat kielen tarjoamia alkuperäisiä tietotyyppejä, kuten int/char/double/pointer jne. Mukautetut tyypit ovat tyyppejä, jotka määrittelemme itse käyttämällä avainsanoja, kuten class/struct.Konstruktori alustetaan tässä automaattisesti, ja VS alustaa myös sisäänrakennetun tyyppikoon. Eri kääntäjillä on erilaiset alustusarvot, eikä C++ määritä niitä.
Mukautetun tyypin jäsenmuuttujien osalta on kutsuttava tämän jäsenmuuttujan oletuskonstruktori sen alustamiseksi.Jos tällä jäsenmuuttujalla ei ole oletuskonstruktoria, raportoidaan virhe. Jos haluamme alustaa tämän jäsenmuuttujan, meidän on käytettävä alustusluetteloa sen ratkaisemiseksi.
Yhteenveto: Useimmissa tapauksissa meidän on toteutettava rakentaja itse. Muutamissa tapauksissa se on samanlainen kuin MyQueue ja kun Stackilla on oletuskonstruktori, MyQueue voidaan luoda ja käyttää automaattisesti.
- ~Stack()
- {
- free(_a);
- _a = nullptr;
- _top = _capacity = 0;
- }
Destruktorin ominaisuudet:
1. Destruktorin nimeä edeltää merkit~
2. Ei parametreja eikä palautusarvoa (yhdenmukainen rakentajan kanssa)
3. Luokassa voi olla vain yksi tuhoaja.Jos määritelmää ei näytetä, järjestelmä luo automaattisesti oletushävittäjän.
4. Kun objektin määritysjakso päättyy, järjestelmä kutsuu automaattisesti tuhoajan.
5. Samoin kuin rakentaja, emme kirjoita kääntäjän automaattisesti luomaa destruktoria emmekä käsittele sisäänrakennettuja mukautetun tyypin jäseniä, jotka kutsuvat muita tuhoajia.
6. On myös huomattava, että kun näytämme destructorin, kutsutaan myös mukautetun tyypin jäsenen tuhoajaa, mikä tarkoittaa, että mukautetun tyypin jäsenen tuhoaja kutsutaan automaattisesti tilanteesta riippumatta.
- //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;
- }
MyQueuen tuhoaja ei tee mitään, mutta C++ edellyttää, että muita tuhoajia kutsutaan vapauttamaan muisti.
Jos resursseja ei pyydetä, destruktoria ei tarvitse kirjoittaa, ja kääntäjän luomaa oletusdestruktoria voidaan käyttää suoraan, kuten Date. Jos luotua oletusdestruktoria voidaan käyttää, tuhoajaa ei tarvitse kirjoittaa erikseen kuten MyQueue, mutta siellä on resurssisovellus
-
-
- 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;
- }