Johdanto C ++ -luokkiin ja objekteihin

click fraud protection

01

klo 09

C ++ -luokkien aloittaminen

Kädet kirjoittamalla kannettavalle tietokoneelle
Sam Edwards / Getty Images

esineet ovat suurin ero C ++: n ja C: n välillä. Yksi aikaisimmista C ++ -nimistä oli C luokilla.

Luokat ja esineet

Luokka on objektin määritelmä. Se on tyyppi aivan kuten int. Luokka muistuttaa a struct vain yhdellä erolla: kaikki rakenteen jäsenet ovat oletuksena julkisia. Kaikki luokan jäsenet ovat yksityisiä.

Muista - luokka on tyyppi ja tämän luokan esine on vain muuttuja.

Ennen kuin objektia voidaan käyttää, se on luotava. Luokan yksinkertaisin määritelmä on:

 luokan nimi {

 // jäsenet

 }


Tämä alla oleva esimerkki malli yksinkertaista kirjaa. OOP: n avulla voit abstrakteja ongelmaa ja ajatella sitä, ei vain mielivaltaisia ​​muuttujia.

 // esimerkki yksi

 #sisältää 

 #sisältää 


 luokkakirja

 {

 int PageCount;

 int Nykyinen sivu; 

 julkinen:

 Kirja (int. Numerot); // Rakentaja

 ~ Kirja () {}; // Tuhoaja

 tyhjä SetPage (int PageNumber);

 int GetCurrentPage (tyhjä);

 }; 


 Kirja:: Kirja (int NumPages) {

 PageCount = NumPages;

 }


 tyhjä kirja:: SetPage (sis. sivunumero) {
instagram viewer

 CurrentPage = PAGENUMBER;

 }


 int-kirja:: GetCurrentPage (tyhjä) {

 palauttaa CurrentPage;

 }


 int main () {

 Kirja ABook (128);

 Kirja. SetPage (56);

 std:: cout << "Nykyinen sivu" <
 paluu 0;

 }


Kaikki koodi luokkakirja alas int-kirja:: GetCurrentPage (tyhjä) { toiminto on osa luokkaa. main () toiminto on olemassa, jotta tästä voidaan suorittaa ajettava sovellus.

02

klo 09

Kirjaluokan ymmärtäminen

vuonna main () Toiminto varten luodaan muuttuja AB-tyyppinen Kirja, jonka arvo on 128. Heti kun suorittaminen saavuttaa tämän pisteen, kohde ABook rakennetaan. Seuraavalla rivillä menetelmä Kirja. SetPage () kutsutaan ja objektille 56 määritetään arvo 56 Kirja. Tämänhetkinen sivu. Sitten cout antaa tämän arvon soittamalla Kirja. GetCurrentPage () menetelmä.

Kun suorittaminen saavuttaa paluu 0; ABook-objektia ei enää tarvita sovelluksessa. Kääntäjä tuottaa puhelun tuhoajalle.

Luokkien julistaminen

Kaikki välillä Luokkakirja ja } on luokka-ilmoitus. Tässä luokassa on kaksi yksityistä jäsentä, molemmat tyypin int. Nämä ovat yksityisiä, koska luokan jäsenten oletusoikeudet ovat yksityisiä.

julkinen: direktiivi kertoo kääntäjä että pääsy täältä on julkinen. Ilman tätä se olisi edelleen yksityinen ja estäisi pää () -toiminnon kolmea riviä pääsemästä Abook-jäsenille. Kokeile kommentoida julkinen: linjaa ja käännä uudelleen nähdäksesi seuraavat kääntämisvirheet.

Tämä alla oleva rivi ilmoittaa rakentajaksi. Tämä on funktio, jota kutsutaan, kun objekti luodaan ensimmäisen kerran.

 Kirja (int. Numerot); // Rakentaja 

Sitä kutsutaan linjalta

 Kirja ABook (128); 

Tämä luo objektin nimeltä AB-tyyppinen Kirja ja kutsuu Kirja () -toiminnon parametri 128.

03

klo 09

Lisätietoja kirjaluokasta

C ++: ssa konstruktorilla on aina sama nimi kuin luokalla. Rakentajalle kutsutaan, kun objekti luodaan, ja kohtaan sinun tulisi laittaa koodisi objektin alustamiseksi.

Kirjassa Seuraava rivi rakentajan jälkeen tuhoaja. Tällä on sama nimi kuin rakentajalla, mutta sen edessä on ~ (tilde). Objektin tuhoamisen aikana hävittäjää kutsutaan puhdistamaan objekti ja varmistamaan, että objektin kaltaiset resurssit, kuten muisti ja tiedostokahva, vapautetaan.

Muistaa—Luokalla xyz on konstruktorifunktio xyz () ja destruktorifunktio ~ xyz (). Vaikka et ilmoittaisi, kääntäjä lisää ne hiljaa.

Tuhoaja kutsutaan aina, kun objekti lopetetaan. Tässä esimerkissä esine hävitetään epäsuorasti, kun se poistuu laajuudesta. Voit nähdä tämän muuttamalla hävittäjäilmoituksen tähän:

 ~ Kirja () {std:: cout << "Tuhoaja nimeltään";}; // Tuhoaja 

Tämä on sisäinen toiminto, jonka koodi on ilmoituksessa. Toinen tapa lisätä riviin on lisätä sana riviin

 inline ~ Kirja (); // Tuhoaja


ja lisää tuhoaja funktiona näin.

 inline Book:: ~ Kirja (tyhjä) { 

 std:: cout << "Tuhoaja kutsuttu";

 }


Sisäiset toiminnot ovat vihjeitä kääntäjälle tehokkaamman koodin luomiseksi. Niitä tulisi käyttää vain pieniin toimintoihin, mutta jos niitä käytetään sopivissa paikoissa - kuten sisällä silmukoita— Voi tehdä huomattavia eroja suorituskyvyssä.

04

klo 09

Luokkamenetelmien kirjoittaminen

Paras harjoitus Objektien tarkoitus on tehdä kaikesta tiedosta yksityinen ja käyttää sitä toimintoina, joita kutsutaan liityntätoimintoiksi. SetPage () ja GetCurrentPage () ovat kahta funktiota, jota käytetään objektimuuttujan käyttämiseen Tämänhetkinen sivu.

Muuta luokka ilmoitus rakentaa ja kääntää uudelleen. Sen pitäisi silti kääntää ja suorittaa oikein. Nyt kaksi muuttujaa PAGECOUNT ja Tämänhetkinen sivu ovat julkisesti saatavilla. Lisää tämä rivi Book ABook (128): n jälkeen, ja se kootaan.

 Kirja. PageCount = 9;


Jos muutat rakenteen takaisin luokka ja kääntää uudelleen, että uusi rivi ei enää käänny muodossa PAGECOUNT on nyt jälleen yksityinen.

:: Merkintä

Kirjaluokituksen ilmoituksen jälkeen jäsentoiminnot ovat neljä määritelmää. Jokainen määritellään Book:: -etuliitteellä sen tunnistamiseksi luokkaan.:: kutsutaan laajuustunnisteeksi. Se tunnistaa toiminnon osaksi luokkaa. Tämä on ilmeistä luokailmoituksessa, mutta ei sen ulkopuolella.

Jos olet ilmoittanut luokan jäsentoiminnon, sinun on annettava funktion runko tällä tavalla. Jos haluat, että Kirjaluokkaa käytetään muissa tiedostoissa, saatat siirtää kirjanilmoituksen erilliseen ylätunniste tiedosto, nimeltään book.h. Mikä tahansa muu tiedosto voisi sitten sisällyttää sen tiedostoon

 #include "book.h" 

05

klo 09

Perintö ja polymorfismi

Tämä esimerkki osoittaa perinnön. Tämä on kaksiluokkainen sovellus, jossa yksi luokka on johdettu toisesta.

 #sisältää 

 #sisältää 


 luokan kohta

 {


 int x, y;

 julkinen:

 Kohta (int atx, int aty); // Rakentaja

 inline virtuaalinen ~ kohta (); // Tuhoaja

 virtuaalinen tyhjä Piirrä ();

 }; 


 luokan ympyrä: julkinen piste {


 int säde;

 julkinen:

 Ympyrä (int atx, int aty, intRadius);

 inline virtuaalinen ~ ympyrä ();

 virtuaalinen tyhjä Piirrä ();

 };



 Piste:: Piste (int atx, int aty) {

 x = atx;

 y = aty;

 }


 inline Point:: ~ Kohta (tyhjä) { 

 std:: cout << "Pistehävittäjää kutsuttiin";

 }


 tyhjä kohta:: Piirrä (tyhjä) {

 std:: cout << "Kohta:: Piirrä kohta kohtaan << x <
 }



 Ympyrä:: Ympyrä (int atx, int aty, int theRadius): Piste (atx, aty) {

 säde = theradius;

 }


 sisäinen ympyrä:: ~ ympyrä () {

 std:: cout << "Circle Destructor nimeltään" << std:: endl;

 }


 tyhjä ympyrä:: Piirrä (tyhjä) {

 Kohta:: Piirrä ();

 std:: cout << "ympyrä:: Piirrä kohta" << "Radius" << säde << std:: endl;

 }


 int main () {

 Ympyrä ACircle (10,10,5);

 ACircle. Piirrä ();

 paluu 0;

 }


Esimerkissä on kaksi luokkaa, piste ja ympyrä, jotka mallintavat pisteen ja ympyrän. A-pisteellä on x- ja y-koordinaatit. Ympyräluokka johdetaan pisteluokasta ja lisää säteen. Molemmat luokat sisältävät a Draw () jäsentoiminto. Jotta tämä esimerkki olisi lyhyt, lähtö on vain teksti.

06

klo 09

perintö

Luokka Ympyrä on johdettu Kohta luokka. Tämä tehdään tällä linjalla:

 luokan ympyrä: kohta {


Koska Circle on johdettu perusluokasta (piste), Circle perii kaikki luokan jäsenet.

 Kohta (int atx, int aty); // Rakentaja

 inline virtuaalinen ~ kohta (); // Tuhoaja

 virtuaalinen tyhjä Piirrä ();


 Ympyrä (int atx, int aty, intRadius);

 inline virtuaalinen ~ ympyrä ();

 virtuaalinen tyhjä Piirrä ();


Ajattele Circle-luokkaa pisteluokana, jolla on ylimääräinen elin (säde). Se perii perusluokan jäsentoiminnot ja yksityiset muuttujat x ja y.

Se ei voi määrittää tai käyttää näitä paitsi implisiittisesti, koska ne ovat yksityisiä, joten sen on tehtävä se Circle-valmistajan Initializer-luettelon kautta. Tämän on hyväksyttävä sellaisena kuin se on nyt. Palaan takaisin alustuslistoihin tulevassa opetusohjelmassa.

Ympyrärakentajassa, ennen theRadius on osoitettu säde, ympyrän pisteosa rakennetaan kutsun avulla Pointin rakentajalle alustusluettelossa. Tässä luettelossa on kaikki välillä: ja {alla.

 Ympyrä:: Ympyrä (int atx, int aty, int theRadius): Piste (atx, aty) 


Muuten, konstruktorityypin alustusta voidaan käyttää kaikille sisäänrakennetuille tyypeille.

 int a1 (10);

 int a2 = 10;


Molemmat tekevät samoin.

07

klo 09

Mikä on polymorfismi?

Polymorfismi on yleinen termi, joka tarkoittaa "monia muotoja". C ++: ssa polymorfismin yksinkertaisin muoto on toimintojen ylikuormitus. Esimerkiksi useita toimintoja kutsutaan SortArray (arraytype) missä sortarray voi olla ryhmä intin tai nelinpeli.

Olemme kuitenkin täällä kiinnostuneita vain polymorfismin OOP-muodosta. Tämä tapahtuu tekemällä funktio (esim. Piirrä ()) virtuaali- perusluokan pisteessä ja ohittamalla se sitten johdettu luokka Ympyrä.

Vaikka toiminto Draw () on virtuaali johdetussa luokassa Ympyrä, tätä ei oikeastaan ​​tarvita - se on vain muistutus minulle, että tämä on virtuaalinen. Jos johdetun luokan funktio vastaa nimiluokan ja parametrityyppien kantaryhmän virtuaalifunktiota, se on automaattisesti virtuaalinen.

Pisteen piirtäminen ja ympyrän piirtäminen ovat kaksi hyvin erilaista toimintoa, joissa vain pisteen ja ympyrän koordinaatit ovat yhteisiä, joten on tärkeää, että oikea Draw () kutsutaan. Tulevassa opetusohjelmassa kerrotaan, kuinka kääntäjä onnistuu luomaan koodin, joka saa oikean virtuaalitoiminnon.

08

klo 09

C ++ -rakentajat

Constructors

Rakentaja on toiminto, joka alustaa objektin jäsenet. Rakentaja osaa vain rakentaa oman luokan esineen.

Rakentajia ei peritä automaattisesti perus- ja johdettujen luokkien välillä. Jos et toimita yhtä johdettuun luokkaan, oletusarvo tarjotaan, mutta tämä ei välttämättä tee mitä haluat.

Jos konstruktoria ei toimiteta, kääntäjä luo oletusarvon ilman parametreja. Aina on oltava rakentaja, vaikka se olisi oletus ja tyhjä. Jos toimitat konstruktorille parametreja, oletusarvoa EI luoda.

Jotkut huomautukset rakentajista:

  • Rakentajat ovat vain toimintoja, joilla on sama nimi kuin luokalla.
  • Rakentajien on tarkoitus alustaa luokan jäsenet, kun luokan ilmentymä luodaan.
  • Rakentajia ei kutsuta suoraan (paitsi alustuslistojen kautta)
  • Rakentajat eivät ole koskaan virtuaalisia.
  • Samalle luokalle voidaan määritellä useita rakentajia. Niiden erottamisessa on oltava erilaiset parametrit.

Rakentajilta, esimerkiksi oletusrakentajilta, määritys- ja kopiointirakentajilta, on vielä paljon opittavaa. Niistä keskustellaan seuraavassa oppitunnissa.

09

klo 09

Siivous C ++ Destructors

Tuhoaja on luokan jäsentoiminto, jolla on sama nimi kuin rakentajalla (ja luokalla), mutta ~ (tilde) edessä.

 ~ Ympyrä ();


Kun esine poistuu laajuudesta tai harvemmin hävitetään nimenomaisesti, sen hävittäjä kutsutaan. Esimerkiksi, jos objektilla on dynaamisia muuttujia, kuten osoittimia, ne on vapautettava ja tuhoaja on sopiva paikka.

Toisin kuin rakentajat, rakentajat voidaan ja pitäisi tehdä virtuaalisiksi, jos sinulla on johdettuja luokkia. vuonna Kohta ja Ympyrä luokkaesimerkki, tuhoajaa ei tarvita, koska suoritettavia puhdistustöitä ei ole (se toimii vain esimerkkinä). Olisiko ollut dynaamisia jäsenmuuttujia (kuten viitteitä) sitten ne olisivat vaatineet vapauttamista muistivuotojen estämiseksi.

Lisäksi, kun johdettu luokka lisää jäseniä, jotka vaativat siivoamisen, tarvitaan virtuaalisia destruktoreita. Kun virtuaalinen, johdettuimpaa luokan tuhoajaa kutsutaan ensin, sitten sen välitöntä esi-isän hävittäjää kutsutaan, ja niin edelleen pohjaluokkaan asti.

Esimerkissämme

 ~ Ympyrä ();

sitten

 ~ Kohta ();


Perusluokkien tuhoajaa kutsutaan viimeiseksi.

Tämä suorittaa tämän oppitunnin loppuun. Seuraavassa oppitunnissa opitaan oletusrakentajista, kopiointirakentajista ja tehtävästä.

instagram story viewer