C ++

Kuinka käyttää C ++ -malleja

Kuinka käyttää C ++ -malleja

Johdanto

C ++ - perusohjelmoinnissa tietotyyppi, esim.g., int tai char, on ilmoitettava ilmoituksessa tai määritelmässä. Arvo, kuten 4 tai 22 tai -5, on int. Arvo, kuten 'A', 'b' tai 'c', on merkki. Mallimekanismin avulla ohjelmoija voi käyttää yleistä tyyppiä joukolle todellisia tyyppejä. Esimerkiksi ohjelmoija voi päättää käyttää tunnistetta T int tai char. C ++ - algoritmilla voi olla useampi kuin yksi yleinen tyyppi. Kun esimerkiksi T on int tai char, U voi tarkoittaa float- tai osoitintyyppiä. Luokka, kuten merkkijono tai vektoriluokka, on kuin tietotyyppi, ja instantioidut objektit ovat kuin tietotyypin arvot, joka on määritetty luokka. Joten mallimekanismi antaa ohjelmoijalle mahdollisuuden käyttää yleistä tyyppitunnistetta luokkaryhmälle.

C ++ -malli luo käytetyn datan tyypistä riippumattoman algoritmin. Joten sama algoritmi, jossa on useita saman tyyppisiä esiintymiä, voi käyttää erilaisia ​​tyyppejä erilaisissa suorituksissa. Muuttujan, funktion, rakenteen ja luokan entiteeteillä voi olla malleja. Tässä artikkelissa kerrotaan, kuinka ilmoitetaan mallit, miten määritetään mallit ja miten niitä käytetään C: ssä++. Sinulla on jo oltava tieto edellä mainituista kokonaisuuksista ymmärtääksesi tämän artikkelin aiheita.

Tyypit

Skalaari

Skalaarityypit ovat tyhjiä, bool, char, int, float ja osoitin.

Luokat tyyppeinä

Tiettyä luokkaa voidaan pitää tyypinä ja sen objekteja mahdollisina arvoina.

Yleinen tyyppi edustaa joukkoa skalaarityyppejä. Skalaarityyppien luettelo on laaja. Esimerkiksi int-tyypillä on muita vastaavia tyyppejä, kuten lyhyt int, pitkä int jne. Geneerinen tyyppi voi edustaa myös luokkaryhmää.

Vaihteleva

Seuraava esimerkki malli-ilmoituksesta ja määritelmästä on seuraava:

sapluuna
T pi = 3.14;

Ennen kuin jatkat, huomaa, että tällaista lausetta ei voi esiintyä main () -funktiossa tai missään lohkon laajuudessa. Ensimmäinen rivi on malli-pää-ilmoitus, jossa ohjelmoija valitsee yleisen tyyppinimen T. Seuraava rivi on määritelmä tunnisteesta pi, joka on yleinen tyyppi T. Tarkkuus riippumatta siitä, onko T int, uimuri tai jokin muu tyyppi, voidaan tehdä C ++ main () -funktiossa (tai muussa toiminnossa). Tällainen tarkkuus tehdään muuttujalla pi eikä T: llä.

Ensimmäinen rivi on malli-pää-ilmoitus. Tämä ilmoitus alkaa varatulla sanalla, mallilla ja sitten avoimilla ja suljetuilla kulmasulkeilla. Kulmasulkeissa on vähintään yksi yleinen tyyppitunniste, kuten T, yllä. Yleisiä tyypin tunnisteita voi olla useampia, joista kutakin edeltää varattu sana, typename. Tällaisia ​​yleisiä tyyppejä siinä asennossa kutsutaan malliparametreiksi.

Seuraava lause voidaan kirjoittaa main () - tai mihin tahansa muuhun toimintoon:

cout << pi << '\n';

Ja toiminto näyttäisi 3.14. Lauseke pi päättää muuttujan pi tarkan T-tyypin. Erikoistuminen päättää malliparametrin tietotyypin. Instantiation on C ++: n sisäinen prosessi tietyn tyypin, kuten float, luomiseksi tässä tapauksessa. Älä sekoita malliparametrin ja luokan instantisointia. Malliaiheessa monilla tietotyypeillä voi olla yksi yleinen tyyppinimi, kun taas monilla luokilla voi olla yksi yleinen luokan nimi. Luokkien yleistä luokan nimeä kutsutaan kuitenkin yksinkertaisesti luokaksi, ei luokkanimeksi. Arvo on myös tietotyypille, kuten int, kuten instantisoitu objekti on luokalle, kuten merkkijono-luokka.

Erikoistumisen yhteydessä valittu tietotyyppi, kuten kelluva, sijoitetaan kulmasulkeisiin muuttujan jälkeen. Jos template-head-deklaraatiossa on enemmän kuin yksi malliparametri, erikoistumislausekkeessa on vastaava määrä tietotyyppejä samassa järjestyksessä.

Erikoistumisessa tyyppi tunnetaan malliargumenttina. Älä sekoita tätä ja funktion kutsun funktio-argumenttia.

Oletustyyppi

Jos erikoistumisessa ei anneta tyyppiä, oletustyyppi oletetaan. Joten seuraavasta lausekkeesta:

sapluuna
U pi = "rakkaus";
näyttö:
cout << pi<> << '\n';

on "rakkautta" jatkuvaan hiiren osoittimeen. Huomaa ilmoituksessa, että U = const char *. Kulmasulkeet ovat tyhjät erikoistumisen yhteydessä (tyyppiä ei anneta); varsinaista tyyppiä pidetään vakiotyyppinä. Jos erikoistumiseen tarvitaan jotain muuta tyyppiä, tyypin nimi kirjoitetaan kulmasulkeisiin. Kun oletustyyppiä halutaan erikoistumisessa, tyypin toistaminen kulmasulkeissa on valinnaista, ts.e., kulmasulkeet voidaan jättää tyhjiksi.

Huomaa: oletustyyppiä voidaan silti muuttaa erikoistumisen yhteydessä, kun sinulla on eri tyyppi.

rakenne

Seuraava esimerkki osoittaa, kuinka malliparametria voidaan käyttää strukturilla:

sapluuna jäsennelty ikä

T Johannes = 11;
T Pietari = 12;
T Mary = 13;
T ilo = 14;
;

Nämä ovat luokan ikäluokkia. Ensimmäinen rivi on malli-ilmoitus. Aaltosulkuinen runko on mallin todellinen määritelmä. Ikä voidaan antaa pääfunktiossa () seuraavilla tavoilla:

Iät luokka7;
cout << grade7.John << " << grade7.Mary << '\n';

Lähtö on: 11 13. Ensimmäinen lausunto suorittaa erikoistumisen. Huomaa, miten se on tehty. Se antaa myös nimen strukturoidulle objektille: grade7. Toisessa lausekkeessa on tavallisia strukturoituja objektilausekkeita. Rakenne on kuin luokka. Täällä Ages on kuin luokan nimi, kun taas grade7 on luokan kohde (struct).

Jos jotkut ikät ovat kokonaislukuja ja toiset ovat kelluvia, struct tarvitsee kaksi yleistä parametria seuraavasti:

sapluuna jäsennelty ikä

T Johannes = 11;
U Pietari = 12.3;
T Mary = 13;
U ilo = 14.6;
;

Main () -funktion asiaankuuluva koodi on seuraava:

Iät luokka7;
cout << grade7.John << " << grade7.Peter << '\n';

Lähtö on: 11 12.3. Erikoistumisessa tyyppien (argumenttien) järjestyksen on vastattava ilmoituksessa olevien yleisten tyyppien järjestystä.

Malli-ilmoitus voidaan erottaa määritelmästä seuraavasti:

sapluuna jäsennelty ikä

T John;
U Peter;
T Mary;
U ilo;
;
Iät luokka7 = 11, 12.3, 13, 14.6;

Ensimmäinen koodisegmentti on puhtaasti mallin ilmoitus (tehtäviä ei ole). Toinen koodisegmentti, joka on vain käsky, on tunnisteen määritelmä grade7. Vasen puoli on tunnisteen luokitus7. Oikealla puolella on alustusluettelo, joka antaa vastaavat arvot strukturijäsenille. Toinen segmentti (lause) voidaan kirjoittaa pääfunktioon, kun taas ensimmäinen segmentti jää pääfunktion () ulkopuolelle.

Ei-tyyppi

Esimerkkejä muista kuin tietotyypeistä ovat int, osoitin objektille, osoitin toiminnalle ja automaattiset tyypit. On muita ei-tyyppejä, joita tämä artikkeli ei käsittele. Ei-tyyppi on kuin keskeneräinen tyyppi, jonka arvo annetaan myöhemmin eikä sitä voi muuttaa. Parametrina se alkaa tietyllä ei-tyypillä, jota seuraa tunniste. Tunnisteen arvo annetaan myöhemmin erikoistumisen yhteydessä, eikä sitä voida muuttaa uudelleen (kuten vakio, jonka arvo annetaan myöhemmin). Seuraava ohjelma kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
sapluuna jäsennelty ikä

T John = N;
U Pietari = 12.3;
T Mary = N;
U ilo = 14.6;
;
int main ()

Iät luokka7;
cout << grade7.John << " << grade7.Joy << '\n';
paluu 0;

Erikoistumisessa kulmasulkeissa oleva ensimmäinen tyyppi int on enemmän muodollisuutta varten, jotta voidaan varmistaa, että parametrien lukumäärä ja järjestys vastaavat tyyppien (argumenttien) määrää ja järjestystä. N: n arvo on annettu erikoistumisen yhteydessä. Lähtö on: 11 14.6.

Osittainen erikoistuminen

Oletetaan, että mallilla on neljä yleistä tyyppiä ja että neljän tyypin joukossa tarvitaan kaksi oletustyyppiä. Tämä voidaan saavuttaa käyttämällä osittaista erikoistumisrakennetta, joka ei käytä tehtävänoperaattoria. Joten osittainen erikoistumisrakenne antaa oletusarvot osalle yleisiä tyyppejä. Osittaisen erikoistumisen järjestelmässä tarvitaan kuitenkin perusluokka (struct) ja osittainen erikoistumisluokka (struct). Seuraava ohjelma kuvaa tämän yhden geneerisen tyypin kahdesta yleisestä tyypistä:

#sisältää
käyttämällä nimitilaa vakio;
// perusmalliluokka
sapluuna
jäsennelty ikä

;
// osittainen erikoistuminen
sapluuna
jäsennelty ikä

T1 Johannes = 11;
kelluva Peter = 12.3;
T1 Maria = 13;
kelluva ilo = 14.6;
;
int main ()

Iät luokka7;
cout << grade7.John << " << grade7.Joy << '\n';
paluu 0;

Tunnista perusluokan ilmoitus ja sen osaluokan määritelmä. Perusluokan malli-pää-ilmoituksessa on kaikki tarvittavat yleiset parametrit. Osittaisen erikoistumisluokan malli-pääilmoituksella on vain yleinen tyyppi. Kaaviossa on ylimääräinen kulmasulkujoukko, joka tulee heti luokan nimen jälkeen osittaisen erikoistumisen määritelmässä. Se tekee osittaisen erikoistumisen. Sillä on oletustyyppi ja muu kuin oletustyyppi perusluokassa kirjoitetussa järjestyksessä. Huomaa, että oletustyypille voidaan silti antaa erilainen tyyppi main () -funktiossa.

Main () -funktion asiaankuuluva koodi voi olla seuraava:

Iät luokka7;
cout << grade7.John << " << grade7.Joy << '\n';

Lähtö on: 11 14.6.

Malliparametripaketti

Parametripaketti on malliparametri, joka hyväksyy nollan tai useamman yleisen mallipohjan vastaaville tietotyypeille. Parametripaketin parametri alkaa varatulla sanalla typename tai luokka. Tätä seuraa kolme pistettä ja sitten pakkauksen tunniste. Seuraava ohjelma kuvaa, kuinka malliparametripakettia voidaan käyttää strukturilla:

#sisältää
käyttämällä nimitilaa vakio;
sapluuna jäsennelty ikä

int Johannes = 11;
kelluva Peter = 12.3;
int Mary = 13;
kelluva ilo = 14.6;
;
int main ()

Iät luokka B;
cout << gradeB.John << " << gradeB.Mary << '\n';
Iät luokka C;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Iät luokkaD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Ikä <> luokka A; // kuten oletus
cout << gradeA.John << " << gradeA.Joy << '\n';
paluu 0;

Tuotos on:

11 13
12.3 14.6
11 14.6
11 14.6

Toimintomallit

Edellä mainitut malliominaisuudet koskevat samalla tavalla toimintomalleja. Seuraava ohjelma näyttää funktion, jossa on kaksi yleistä malliparametriä ja kolme argumenttia:

#sisältää
käyttämällä nimitilaa vakio;
sapluuna void func (T no, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
paluu 0;

Tuotos on seuraava:

Kaupassa on 12 kirjaa, joiden arvo on 500 dollaria.

Erottaminen prototyypistä

Funktion määrittely voidaan erottaa sen prototyypistä, kuten seuraava ohjelma osoittaa:

#sisältää
käyttämällä nimitilaa vakio;
sapluuna void func (T-nro, U-cha, const-char * str);
sapluuna void func (T no, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
paluu 0;

Huomaa: Funktiomallin ilmoitus ei voi näkyä pääfunktiossa () tai missään muussa funktiossa.

Ylikuormitus

Saman toiminnon ylikuormitus voi tapahtua erilaisilla malli-pää-ilmoituksilla. Seuraava ohjelma kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
sapluuna void func (T no, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

sapluuna void func (T no, const char * str)

cout << "There are " << no << " books worth $" << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
func (12, "500");
paluu 0;

Tuotos on:

Kaupassa on 12 kirjaa, joiden arvo on 500 dollaria.

Kaupassa on 12 kirjaa, joiden arvo on 500 dollaria.

Luokan mallit

Edellä mainittujen mallien ominaisuudet koskevat samalla tavalla kuin luokan malleja. Seuraava ohjelma on yksinkertaisen luokan ilmoittaminen, määrittely ja käyttö:

#sisältää
käyttämällä nimitilaa vakio;
luokka TheCla

julkinen:
int numero;
staattinen hiili;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

staattinen tyhjä hauska (char ch)

jos (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

The Cla obj;
obj.numero = 12;
obj.func ('$', "500");
paluu 0;

Tuotos on seuraava:

Kaupassa on 12 kirjaa, joiden arvo on 500 dollaria.

Seuraava ohjelma on yllä oleva ohjelma, jossa on malli-pääilmoitus:

#sisältää
käyttämällä nimitilaa vakio;
sapluuna luokka TheCla

julkinen:
T-numero;
staattinen U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

staattinen tyhjä hauska (U ch)

jos (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.numero = 12;
obj.func ('$', "500");
paluu 0;

Malliparametriluettelossa olevan sanan typename sijasta voidaan käyttää sanaluokkaa. Huomaa erikoistuminen objektin ilmoituksessa. Tuotos on edelleen sama:

Kaupassa on 12 kirjaa, joiden arvo on 500 dollaria.

Julistuksen erottaminen

Luokkamallin ilmoitus voidaan erottaa luokan koodista seuraavasti:

sapluuna luokka TheCla;
sapluuna luokka TheCla

julkinen:
T-numero;
staattinen U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

staattinen tyhjä hauska (U ch)

jos (ch == 'a')
cout << "Official static member function" << '\n';

;

Staattisten jäsenten käsittely

Seuraava ohjelma näyttää, miten staattiseen datajäseneen ja staattisen jäsenen toimintoon päästään:

#sisältää
käyttämällä nimitilaa vakio;
sapluuna luokka TheCla

julkinen:
T-numero;
staattinen U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

staattinen tyhjä hauska (U cha)

jos (ch == 'a')
cout << "Official static member function" << cha << '\n';

;
sapluuna U TheCla:: ch = 'a';
int main ()

TheCla:: hauskaa ('.');
paluu 0;

Arvon määrittäminen staattiselle datajäsenelle on ilmoitus, eikä se voi olla pääosin (). Huomaa yleisten tyyppien ja tietotyyppien käyttö ja sijainnit määrityslausekkeessa. Huomaa lisäksi, että staattisen datan jäsenfunktio on kutsuttu pääosaan (), todellisten mallipohjatyyppien kanssa. Tuotos on seuraava:

Virallinen staattisen jäsenen toiminto.

Koostaminen

Ilmoituksen (otsikon) ja mallin määrityksen on oltava yhdessä tiedostossa. Eli heidän on oltava samassa käännösyksikössä.

Johtopäätös

C ++ -mallit tekevät algoritmista riippumaton käytetyn datan tyypistä. Muuttujan, funktion, rakenteen ja luokan entiteeteillä voi olla malleja, jotka sisältävät ilmoituksen ja määritelmän. Mallin luomiseen liittyy myös erikoistuminen, jolloin yleinen tyyppi ottaa todellisen tyypin. Sekä ilmoituksen että mallin määrittelyn on oltava yhdessä käännösyksikössä.

How to reverse Mouse and Touchpads scrolling direction in Windows 10
Mouse and Touchpads not only make computing easy but more efficient and less time-consuming. We cannot imagine a life without these devices, but still...
How to change Mouse pointer and cursor size, color & scheme on Windows 10
The mouse pointer and cursor in Windows 10 are very important aspects of the operating system. This can be said for other operating systems as well, s...
Ilmaiset ja avoimen lähdekoodin pelimoottorit Linux-pelien kehittämiseen
Tämä artikkeli kattaa luettelon ilmaisista ja avoimen lähdekoodin pelimoottoreista, joita voidaan käyttää 2D- ja 3D-pelien kehittämiseen Linuxissa. Tä...